gpt4 book ai didi

c++ - Seekg 未按预期运行

转载 作者:行者123 更新时间:2023-11-28 01:36:48 26 4
gpt4 key购买 nike

    #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) 函数的实现它在某些文件上的行为不符合预期当运行为 ojit_代码

那些没有按预期运行的文件具有字符数(包括行尾字符和其他空格)小于 9 的属性(9 是我们在 seekg 之前从 cin 中读取的字符数)

如果文件包含超过 9 个字符,则它的行为符合预期例如:

./a.out < filename

将输出为

123456789

少于9个字符的文件不会输出

例如:

123456789

不会给出任何输出

最佳答案

对于少于 9 个字符的文件,您已经尝试通过初始 read 读取结尾。这意味着 eof(文件结尾)和 fail 标志已为流设置,而 seekg 可能会重置 eof,它不会重置失败 (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 位仍然设置。第二个和第三个有输出,因为它从未被设置(输出是显示的字符加上一个换行符)。

要修复此问题,只需在 seekg 之前插入以下内容,即可清除 fail 位:

std::cin.clear();

然后在八个字符的文件上运行该代码会得到:

eof/fail=1/1
eof/fail=0/0
1234567

显示 clear 确实清除了 fail 位。


您可能还想记住,流不是可搜索的要求,尤其是当它只是通过标准输入进入时。如果您已经阅读了大量的流,您可能会发现对于某些大小的文件,您无法搜索任意数量的文件。


(a) 对于我们当中的语言律师,无格式输入函数(C++11 27.7.2.3/41C++14 27.7.2.3/41C++17 30.7.4.3/41) 关于 seekg 工作原理的文本基本相同(我的重点):

After constructing a sentry object, if fail() != true, executes ...

关于c++ - Seekg 未按预期运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48979934/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com