#include <string>
#include <iostream>
int main() {
std::string str;
char magic[9];
std::cin.read((char *)magic, sizeof(magic));
std::cin.seekg(0, std::ios::beg);
while (std::cin >> str) {
std::cout << str << std::endl;
}
}
我的代码包含对std :: cin的seekg(0)功能的实现
它在某些文件上表现不佳
当以
./a.out < filename
那些表现不正常的文件具有的字符数(包括结束符和其他空格)少于9(9是我们在lookg之前从cin读取的字符数)的属性
如果文件包含9个以上的字符,则其行为符合预期
例如:
123456789
将输出为
123456789
少于9个字符的文件将不会输出
例如:
1234
将不输出
最佳答案
对于少于9个字符的文件,您已经尝试使用初始read
读完结尾。这意味着已经为流设置了eof
(文件末尾)和fail
标志,尽管seekg
可能会重置eof
,但不会重置fail
(a)。
您可以通过插入以下内容进行检查:
cout << "eof/fail=" << cin.eof() << '/' << cin.fail() << '\n';
seekg
之前和之后。对于分别为8、9和10的文件大小,您将获得:eof/fail=1/1
eof/fail=0/1
eof/fail=0/0
eof/fail=0/0
12345678
eof/fail=0/0
eof/fail=0/0
123456789
您可以看到第一个失败导致没有输出,因为
fail
位置1。第二个和第三个具有输出,因为它从未设置过(输出是显示的字符加上一个换行符)。要修复此问题,只需在
fail
之前插入以下内容即可清除seekg
位:std::cin.clear();
然后在八个字符的文件上运行该代码将得到:
eof/fail=1/1
eof/fail=0/0
1234567
显示
clear
确实清除了fail
位。您可能还需要记住,并不是流是可搜索的,尤其是仅通过标准输入进入时。您可能会发现,对于某些大小的文件,如果您已经阅读了很大一部分流,就无法找回任意数量的文件。
(a)对于我们中间的语言律师,
Unformatted input functions
(C++11 27.7.2.3/41
,C++14 27.7.2.3/41
和C++17 30.7.4.3/41
)在seekg
的工作原理上都有基本上相同的文字(我强调):构造哨兵对象后,如果fail()!= true,则执行...
关于c++ - 似乎行为异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48979934/