#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 functionsC++11 27.7.2.3/41C++14 27.7.2.3/41C++17 30.7.4.3/41)在seekg的工作原理上都有基本上相同的文字(我强调):


  构造哨兵对象后,如果fail()!= true,则执行...

关于c++ - 似乎行为异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48979934/

10-11 22:58