使用istream :: ignore()函数时如何检查EOF条件?

时间:2017-06-16 07:40:48

标签: c++

我的测试文件只包含2个字符:a\n

$ hexdump -C a.txt
00000000  61 0a                                             |a.|
00000002

我想测试istream::ignore功能:

(1)我使用ifs.ignore(2)来跳过a\n

#include <iostream>
#include <fstream>
#include <limits>

using namespace std;

int main() {
    std::ifstream ifs("a.txt");

    while (!ifs.eof())
    {
        std::cout << "Not end of file\n";
        ifs.ignore(2);
    }   
    return 0;
}

测试结果如下:

$ ./a.out
Not end of file

程序只输入一次循环,符合我的期望。

(2)我使用std::numeric_limits<std::streamsize>::max(), '\n'来跳过a\n

#include <iostream>
#include <fstream>
#include <limits>

using namespace std;

int main() {
    std::ifstream ifs("a.txt");

    while (!ifs.eof())
    {
        std::cout << "Not end of file\n";
        ifs.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
    }   
    return 0;
}

但是这次程序进入循环2时间:

$ ./a.out
Not end of file
Not end of file

我无法理解这一点。根据我的理解:

ifs.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

应该传递所有字符,而ifs.eof()应该第二次返回true

1 个答案:

答案 0 :(得分:0)

std::basic_istream::ignore只有在遇到流的末尾时才会设置eofbit。在你的情况下,它会遇到\n,丢弃它,然后返回而不进一步检查流。因此,它在第一次迭代中没有遇到流的结束,因为它在提取delim之后停止检查;据他所知,\n之后可能会有更多数据,因为它还没有尝试过查看它。