任何人都可以在使用C ++访问文件时解释这种条件是如何工作的。在while条件中,employeeLine
是一个字符串。
while ( !inFile.getline( employeeLine, MAX_LINE, ‘\n’ ).eof( ) )
{
//some code here
}
如果文件包含这样的数据,那么 代码是否会处理最后一行数据,因为没有换行符
Tomb33bb9.75< \ n>
bbMarybb26bb10.15 (EOF)
答案 0 :(得分:3)
首先,inFile.getline(...)
返回流,即对inFile
的引用。当流到达文件末尾时,标记std::ios_base::eofbit
将被设置,inFile.eof()
将返回true
。虽然有任何输入,但不会设置此标志。如果最后一行不完整,即缺少换行符,则不会被处理!
但是,请注意,可能无法访问文件末尾:如果出现问题,则设置std::ios_base::failbit
并且流不会响应任何进一步尝试阅读的内容:您将拥有无限循环。当行太长而无法放入缓冲区时,std::istream::getline()
会设置std::ios_base::failbit
(即,有多个MAX_LINE - 1
个字符)。流可能在没有设置std::ios_base::eofbit
的情况下进入故障模式的另一种可能情况是从使用的流缓冲区抛出异常时。
一般来说,更好的方法是依靠转换为bool
来获取流,即使用
while (inFile.getline(employeeLine, MAX_LINE)) {
// ...
}
没有必要将'\n'
作为最后一个参数传递,因为它是默认值。也没有坏处。
请注意,上述代码不会处理超过MAX_LINE
的行。这可能是有意的,例如,以避免基于无限大线的拒绝服务攻击。通常,最好使用std::string
,但是:
for (std::string line; std::getline(inFile, line); ) {
// ...
}
答案 1 :(得分:0)
如果“inFile.getline( employeeLine, MAX_LINE, ‘\n’ ).eof( )
”返回TRUE,则表示我们到达“inFile”的末尾。所以“!inFile.getline( employeeLine, MAX_LINE, ‘\n’ ).eof( )
”意味着我们没有达到“inFile”的结尾。
请参阅MSDN
中的详细信息