我正在编写一个程序来从文件中获取输入并将其显示在控制台上。问题是最后一个条目重复了两次。代码如下: -
int main(void)
{
string filename;
int grades;
cout<<"Enter the filename:"<<endl;
getline(cin,filename);
ifstream inFile(filename.c_str(),ios::in);
if(!inFile){
cout<<"File does not exist."<<endl;
exit(1);
}
while(!inFile.eof())
{
inFile>>grades;
cout<<grades<<endl;
}
inFile.close();
return 0;
}
你可以帮我找出错误吗?我在网上搜索过,我的代码似乎在语法上和逻辑上都是正确的。
答案 0 :(得分:2)
这是错误的
while(!inFile.eof())
{
inFile>>grades;
cout<<grades<<endl;
}
这是对的
while (inFile >> grades)
{
cout << grades << endl;
}
必须是此论坛上最常见的错误。 eof()
并未告诉您下一次读取文件结尾错误,它会告诉您最后读取因文件结尾而失败。因此,如果您必须使用eof()
,则应在>之后使用,而不是之前。
答案 1 :(得分:0)
语法正确,是的。但不是逻辑上的。你正在使用
eof()
错误。
首先要意识到的是所有的功能 测试状态将其结果基于最后一个输入。你必须 在使用任何东西之前总是检查输入是否成功 你输入了;当你写:
inFile >> grades;
std::cout << grades;
你不验证输入之前是否成功
获得成绩。在这种情况下,如果输入失败,您将获得
以前的价值;如果没有以前的价值,你得到
未定义的行为。在>>
和<<
之间的某处,
你必须检查>>
是否成功。
检查成功的常用方法是使用流
本身作为布尔值。并且因为>>
返回引用
对于流,编写循环的惯用方法是:
while ( inFile >> grades ) {
std::cout << grades << std::endl;
}
从软件工程的角度来看,它太可怕了
(在while
的条件下修改状态),但是成语
无处不在,以至于其他任何事情都会引发问题。
如果因任何原因出现输入错误,这将停止。一旦 你已经看到了失败(只有那时),你可以问为什么:
if ( inFile.bad() ) {
// Serious hardware failure...
} else if ( !inFile.eof() ) {
// Format error in the input...
} else {
// Normally, no more data in the input stream, but
// there are a few special cases where you could still
// have a format error and end up here. Not with
// `int`, however.
}
但同样,在输入失败后,这只 有效。