我的测试文件只包含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
。
答案 0 :(得分:0)
std::basic_istream::ignore
只有在遇到流的末尾时才会设置eofbit
。在你的情况下,它会遇到\n
,丢弃它,然后返回而不进一步检查流。因此,它在第一次迭代中没有遇到流的结束,因为它在提取delim
之后停止检查;据他所知,\n
之后可能会有更多数据,因为它还没有尝试过查看它。