我正在解决一个编程问题,以提高我的技能(我还是一个新手)我已经逐行检查了我的解决方案,我想根本没有任何问题(或者是吗?)。
这是我的代码:
#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”);在最后部分只是为了看看是否一切顺利,但问题是该程序只是眨眼并完成。它根本没有创建任何输出文件。
我会非常感谢能帮助像我这样的新手的人。谢谢! :)
答案 0 :(得分:3)
while (!in.eof())
is almost always wrong。你是从哪里学到的?
您的流提取也没有错误处理。没有任何。其中一个用于执行整数除法:如果除法发生在0
?
让自己养成使用调试器来查找正在发生的事情的习惯。 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
,但也可以做。”