【发布时间】:2024-06-10 04:30:01
【问题描述】:
试图读取/打印文件的内容,其中最后一行不以“\n”结尾。程序只是错过了这些数据
while ( !readFile.eof() ) {
string s;
getline( readFile, s );
if ( readFile.eof() ) break;
//operate on data...
cout << s << endl;
}
【问题讨论】:
试图读取/打印文件的内容,其中最后一行不以“\n”结尾。程序只是错过了这些数据
while ( !readFile.eof() ) {
string s;
getline( readFile, s );
if ( readFile.eof() ) break;
//operate on data...
cout << s << endl;
}
【问题讨论】:
请参考Why is iostream::eof inside a loop condition (i.e. `while (!stream.eof())`) considered wrong?
您需要将std::getline() 调用直接移动到while 语句中:
string s;
while ( getline( readFile, s ) ) {
//operate on data...
cout << s << endl;
}
循环将一直运行,直到到达EOF 并且没有更多数据要读取。最后一行是否用换行符分隔无关,因为std::getline() 会做正确的事情并返回最后一行的数据,即使它没有分隔。
所以,std::getline() 实际上确实返回了最后一行,即使它没有分隔,但你只是忽略它,因为这个逻辑:
getline( readFile, s );
if ( readFile.eof() ) break;
//operate on data...
如果最后一行没有分隔,则提前打破你的循环,因为std::getline() 在阅读时遇到readFile 时会将eofbit 设置为EOF,但s 实际上会包含最后一行的数据,然后您将其忽略。
通过将std::getline() 直接移动到while 语句中,它将依赖流的bool conversion operator,如果设置了eofbit 并且没有设置任何错误标志(@ 987654342@ 或 badbit),允许循环处理非定界行。当下一次循环迭代尝试读取过去的EOF 时,std::getline() 将在流上设置failbit,导致bool 运算符返回false,从而中断循环。
【讨论】:
std::getline() 将简单地读取直到 EOF,在流上设置eofbit,并返回它读取的任何内容。当仅设置 eofbit 时,流的 bool 运算符返回 true,因此循环不会在 EOF 本身上中断。只有当std::getline() 尝试读取过去的 EOF 时,failbit 才会被设置在流上,bool 运算符才会返回 false,从而中断循环。