std :: getline()未读取没有'\ n'的输入文件的最后一行

问题描述 投票:0回答:1

尝试读取/打印文件的内容,其中最后一行不以'\ n'结尾。程序只是错过了该数据

while ( !readFile.eof() ) {
    string s;
    getline( readFile, s );
    if ( readFile.eof() ) break;
  //operate on data...
    cout << s << endl;
}
newline eof getline
1个回答
0
投票

请参阅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,并且没有更多数据可读取。最后一行是否用换行符定界是irrelevant,因为std::getline()将做正确的事情并返回最后一行的数据,即使它没有定界。

照原样进行:

getline( readFile, s );
if ( readFile.eof() ) break;
//operate on data...

如果没有分隔最后一行,则会过早中断循环,因为std::getline()将在eofbit上设置readFile,但是s实际上将在其中包含最后一行的数据,然后您将忽略该数据。通过直接将std::getline()移到while语句中,它将依赖于流的bool conversion operator,当仅设置bool时,该流将返回true,从而允许循环处理最后一条非定界行。当下一个循环迭代尝试读取eofbit时,EOF将在流上设置std::getline(),使failbit运算符返回bool,从而中断循环。


-1
投票

为了从文件中读取数据的最后一行,其中最后一行不包含'\ n'字符,请使用三元运算符创建一个分支条件来检查eof“ \ 3”字符。

false
© www.soinside.com 2019 - 2024. All rights reserved.