C++ 为什么我的代码似乎在运行时失败并停止?(C+;+;文件IO)

C++ 为什么我的代码似乎在运行时失败并停止?(C+;+;文件IO),c++,C++,我目前正在解决一个编程问题,以提高我的技能(我还是一个新手)。我已经逐行检查了我的解决方案,我想根本没有问题(或者有问题吗?) 这是我的代码: #include <iostream> #include <fstream> #include <stdio.h> #include <string.h> using namespace std; int main(){ int nGroup; ifstream in("gift1.in

我目前正在解决一个编程问题,以提高我的技能(我还是一个新手)。我已经逐行检查了我的解决方案,我想根本没有问题(或者有问题吗?)

这是我的代码:

#include <iostream>
#include <fstream>
#include <stdio.h>
#include <string.h>
using namespace std;

int main(){
    int nGroup;
    ifstream in("gift1.in");

    in >> nGroup;

    string group[nGroup];


    for (int i = 0; i < nGroup; i++){
        in >> group[i];
    }


    int money[nGroup];
    for (int i = 0; i < nGroup; i++) money[i] = 0;
    string tempName;
    int receivers,toGive,tempMoney;

    while(!in.eof()){
      in >> tempName;
      // Give out money
      for (int i = 0; i < nGroup; i++){   // Check for who gave
          if (tempName.compare(group[i]) == 0){
             in >> tempMoney >> receivers;
             toGive = tempMoney / receivers;
             money[i] -= (toGive * receivers);
          }
      }
      // Receive money
      for (int i = 1; i <= receivers; i++){
          in >> tempName;
          for (int j = 0; j < nGroup; j++){   // Check for who to receive
              if (tempName.compare(group[j]) == 0){
                 money[j] += toGive;
              }
          }
      }

    }

    // Write results to output file
    ofstream fout("gist1.out");
    for (int i = 0; i < nGroup; i++){
        fout << group[i] << " " << money[i] << endl;
    }

    in.close();
    fout.close();
    system("PAUSE");
    return 0;
}
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
int-nGroup;
ifstream in(“gift1.in”);
在>>n组中;
字符串组[nGroup];
for(int i=0;i>组[i];
}
国际货币组织;
对于(int i=0;i>tempName中;
//出钱
对于(inti=0;i>临时货币>>接收器中;
toGive=临时货币/接收者;
货币[i]-=(toGive*接收者);
}
}
//收钱
对于(inti=1;i>tempName;
对于(intj=0;jeof()
在到达文件末尾时不会变为真。只有当您尝试读取文件末尾时才会变为真。您需要像这样构造while循环:

for (;;)
{
   in >> tempName;
   if (in.fail()) break; // fail() checks for both EOF and a read error
   // etc
一个严格的防御性输入解析器会在每次
>
操作后检查
fail()
;如果您可以假定输入的正确性达到一定程度,那么您可以得到比这更低的正确性。

我不确定这是您的代码唯一的问题,但您犯了一个非常常见的错误:
eof()
当您到达文件末尾时不会变为真。只有当您尝试读取超过文件末尾时才会变为真。您需要像这样构造while循环:

for (;;)
{
   in >> tempName;
   if (in.fail()) break; // fail() checks for both EOF and a read error
   // etc
一个严格的防御性输入解析器会在每次
>
操作后检查
fail()
;如果您可以假设输入的正确性达到一定程度,那么您可以得到比这更低的正确性。

。您是从哪里学来的

您的流提取也没有错误处理。没有任何错误处理。其中一个用于执行整数除法:如果除法发生在
0

    <>你可能会看到什么是“浮点异常”(不与C++异常混淆)来自OS并终止程序。这是因为你不能在不破坏宇宙的情况下整数除以零。
养成使用调试器来找出发生了什么的习惯。堆栈溢出不是调试器。

你从哪里学会的

您的流提取也没有错误处理。没有任何错误处理。其中一个用于执行整数除法:如果除法发生在
0

    <>你可能会看到什么是“浮点异常”(不与C++异常混淆)来自OS并终止程序。这是因为你不能在不破坏宇宙的情况下整数除以零。

养成使用调试器找出问题所在的习惯。堆栈溢出不是调试器。

您试图读取整个文件,并为此使用了
eof
;其他答案详细说明了错误原因,下面介绍了如何正确执行:

while (in >> temp)
{
    // ...
}

这基本上意味着“虽然你可以从
中的
读入
temp
,但要做些什么”。

你正在尝试读取整个文件,你使用
eof
来实现这一点;其他答案详细说明了为什么这是错误的,下面是正确的方法:

while (in >> temp)
{
    // ...
}

这基本上意味着“虽然你可以从
中的
读入
temp
,但你可以做一些事情”。

你可以发布一些gift1的示例内容吗?@stevieG中的示例内容可以在上面的链接上找到。@LihO:不太可能:),我刚进入这个有编程问题数据库的网站。还有,这和C有什么关系?@LightnessRacesinOrbit Gulp.。你伤了我的心,但伙计你"你太棒了!原来一个输入是零,这使得我的程序被零除=错误…谢谢你!我会从中学到很多!你可以把你的评论作为一个答案,我会检查一下,给你应得的分数:d你能为gift1发布一些示例内容吗?@stevieG可以在上面的链接上找到示例内容。@LihO:Not真的:),我刚进入一个有编程问题数据库的网站。还有,这和C有什么关系?@LightnessRacesinOrbit Gulp.。你伤了我的心,但你真的很伤心"你太棒了!原来一个输入是零,这使得我的程序被零除=错误…谢谢你!我会从中学到很多!你可以把你的评论作为一个答案,我会查出来给你应得的分数:谢谢你!我真蠢。。。haha@Raven:没问题。不过提醒一下,调试并不是真正的目的。Th安克斯老兄!愚蠢的我。。。haha@Raven:没问题。不过提醒一下,调试并不是真正的目的。您也可以使用更惯用的
if(!(in>>tempName))
。它会检查所有错误情况,包括文件结尾。如果(!(in>>tempName))您可以使用更惯用的
if(!)
此外,它会检查所有错误情况,包括文件结尾。