gpt4 book ai didi

c++ - 检查stdin/std::cin是否支持seeking

转载 作者:行者123 更新时间:2023-11-28 08:22:21 26 4
gpt4 key购买 nike

编辑:我在代码中有一个愚蠢的错误并修复了它,所以现在一切都可以解释了。我相应地更新了我的帖子。

以下代码表明在行缓冲区内查找是有效的。

首先,将某些内容通过管道传输到程序中时的结果。

$ echo 'asdf' | ./seektest
stdin does not support fseek()
c == s
std::cin does not support seekg()
Second read to std::cin failed!
c == ?
Second read to std::cin failed!
c == ?

其次,我输入“a[enter]s[enter]d[enter]f[enter]”。

$ ./seektest 
a
stdin supports fseek().
s
c == s
std::cin supports seekg().
d
c == d
c ==

第三,我为每个 getc/get() 调用键入“asdf”。

$ ./seektest 
asdf
stdin supports fseek().
asdf
c == a
std::cin supports seekg().
asdf
c == a
c == s

搜索似乎在行缓冲区内工作。

这是代码。

#include <iostream>
#include <cstdio>

int main(int argc, char ** argv)
{
// Try cstdio.
int x = fgetc(stdin);
if (x < 0) {
fprintf(stderr, "First read to stdin failed!.");
}
int res = fseek(stdin, -1, SEEK_CUR);
if (!res) {
fprintf(stdout, "stdin supports fseek().\n");
} else {
fprintf(stdout, "stdin does not support fseek()\n");
}
x = fgetc(stdin);
if (x < 0) {
fprintf(stderr, "Second read to stdin failed!\n");
}
char c = x;
fprintf(stdout, "c == %c\n", c);

// Try iostream.
x = std::cin.get();
if (std::cin.fail()) {
fprintf(stderr, "First read to std::cin failed!\n");
}
std::cin.seekg(-1, std::ios::cur);
if (std::cin.fail()) {
fprintf(stdout, "std::cin does not support seekg()\n");
} else {
fprintf(stdout, "std::cin supports seekg().\n");
}
c = std::cin.get();
if (std::cin.fail()) {
fprintf(stderr, "Second read to std::cin failed!\n");
}
fprintf(stdout, "c == %c\n", c);
c = std::cin.get();
if (std::cin.fail()) {
fprintf(stderr, "Second read to std::cin failed!\n");
}
fprintf(stdout, "c == %c\n", c);

return 0;
}

最佳答案

在我看来,您的情况在这里发生了逆转:

if (std::cin.fail()) {
fprintf(stdout, "std::cin supports seekg().\n");
} else {
fprintf(stdout, "std::cin does not support seekg().\n");
}

std::cin “支持 seekg()” 如果它失败

关于c++ - 检查stdin/std::cin是否支持seeking,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5336547/

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