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

时间:2012-01-31 17:03:39

标签: c++

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

Programming Problem link->

这是我的代码:

#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;
}

现在,我尝试调试我的代码,我确信它正在处理“while(!in.eof()”部分。 我专心插入系统(“PAUSE”);在最后部分只是为了看看是否一切顺利,但问题是该程序只是眨眼并完成。它根本没有创建任何输出文件。

我会非常感谢能帮助像我这样的新手的人。谢谢! :)

3 个答案:

答案 0 :(得分:3)

while (!in.eof()) is almost always wrong。你是从哪里学到的?

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

,该怎么办?
  • 您可能会看到一些令人困惑的“浮点异常”(不要与C ++异常混淆)来自操作系统并终止您的程序。那是因为你不能在不破坏宇宙的情况下将整数除以零。

让自己养成使用调试器来查找正在发生的事情的习惯。 Stack Overflow不是调试器。

答案 1 :(得分:1)

我不确定这是您的代码的唯一问题,但是您犯了一个非常常见的错误:{<1}}在您到达时不会成为文件的结尾。只有当您尝试读取过去文件末尾时才会成立。你需要构建你的while循环,如下所示:

eof()

严重防御性输入解析器会在每次 for (;;) { in >> tempName; if (in.fail()) break; // fail() checks for both EOF and a read error // etc 操作后检查fail();如果你可以在输入中假设某种程度的正确性,那么你可以用更少的东西来逃避。

答案 2 :(得分:0)

您正在尝试阅读整个文件,并为此使用eof;其他答案详细说明为什么这是错误的,这是如何正确地做到这一点:

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

这基本上意味着“虽然你可以从in读到temp,但也可以做。”