c++ - 在 C++ 文件中使用 eof()

标签 c++ file

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

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

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

墓33bb9.75<\n>

bb玛丽bb26bb10.15 (eof)

最佳答案

首先,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); ) {
    // ...
}

关于c++ - 在 C++ 文件中使用 eof(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20985712/

相关文章:

c++ - 为什么 {fmt} 比 std::stringstream 慢?

C++ WxWidgets : Redirecting Stdout to a wxTextCtrl across mulitple threads

regex - 如何删除ubuntu双引号中的“字符?

c - 您好,我正在使用 JDoodle 练习 C 编程,我创建了一个指向 .text 文件的 fpointer,如何打开这个 .text 文件并查看数据?

c++ - DirectX 9 高级教程 C++

c++ - MiscFlags D3D11_RESOURCE_MISC_GDI_COMPATIBLE 用于 GDI 兼容纹理,但 IDXGISurface1::GetDC 抛出异常

c++ - 如何从 C++ 核心指南检查程序检查路径中排除文件夹?

string - 如何使用 Vbscript 检查输入字符串是文件名还是文件夹名

c++ - 如何从末尾截断文件? (跨平台)

java - 如何在文件编写器中合并方法