在C++中的文件中使用eof()

Use of eof() in files in C++

本文关键字:eof 文件 C++      更新时间:2023-10-16

有人能解释一下在C++中访问文件时这个while条件是如何工作的吗。在while条件下,employeeLine是一个字符串。

while ( !inFile.getline( employeeLine, MAX_LINE, ‘n’ ).eof( ) )
{
//some code here
}

如果文件包含这样的数据,那么代码是否处理最后一行数据,因为没有换行符

Tomb33bb9.75<\n>

bb 2015年3月26日

首先,inFile.getline(...)返回流,即对inFile的引用。当流到达文件末尾时,标志std::ios_base::eofbit被设置,inFile.eof()返回true。如果有任何输入,则不会设置此标志。如果最后一行不完整,即缺少换行符,则不会对其进行处理!

然而,请注意,可能不一定能到达文件的末尾:如果出现问题,则设置std::ios_base::failbit,并且流不会对任何进一步的读取尝试做出响应:您将有一个无限循环。当行太长而无法放入缓冲区时(即,有超过MAX_LINE - 1个字符),std::istream::getline()确实设置std::ios_base::failbit。流可能在不设置std::ios_base::eofbit的情况下进入故障模式的另一种潜在情况是从使用过的流缓冲区抛出异常。

通常,更好的方法是依赖于流到bool的转换,即使用

while (inFile.getline(employeeLine, MAX_LINE)) {
// ...
}

不需要传递'n'作为最后一个参数,因为它是默认参数。也没有害处。

注意,上面的代码不会处理长度超过MAX_LINE的行。这可能是有意的,例如,为了避免基于无限大线路的拒绝服务攻击。通常,最好使用std::string,但是:

for (std::string line; std::getline(inFile, line); ) {
// ...
}

如果"inFile.getline( employeeLine, MAX_LINE, ‘n’ ).eof( )"返回TRUE,则表示我们到达了"inFile"的末尾。所以"!inFile.getline( employeeLine, MAX_LINE, ‘n’ ).eof( )"意味着我们没有到达"inFile"的末尾。

请参阅MSDN 中的详细信息