gpt4 book ai didi

c++ - 在吃 EOF 后重用 std::cin

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:04:52 25 4
gpt4 key购买 nike

unix 命令 wc具有此功能:

$ wc - - -
aaa bbb ccc<EOF>
0 3 11 -
aaa bbb ccc<EOF>
0 3 11 -
aaa bbb ccc<EOF>
0 3 11 -
0 9 33 total

每个<EOF>表示 <C-d>输入 EOF 的键序列进入标准输入。然后 wc 能够拿起这个 EOF .

我正在尝试用 C++ 实现它。一个常见的建议是组合 clear()ignore() .

char c;
while (std::cin >> c) { ... }

std::cin.clear();
std::cin.ignore();

while (std::cin >> c) { /* never executed */ }

我也试过 std::cin.peekg(std::cin.beg) ,这也不起作用。

最佳答案

在 Davis 的耐心帮助下,我了解了使用 Ctrl+D 完成的键入输入与我不知道的此处文档之间的区别。 (我向 Davis Herring 致敬。)

有一次,我明白了 C++ 中的其余部分非常简单,如我的 MCVE 中所示.

行数.cc:

#include <fstream>
#include <iostream>
#include <string>

unsigned process(const std::string &fileName, std::istream &in)
{
unsigned nLines = 0;
if (in.bad()) {
std::cerr << "ERROR: Cannot open '" << fileName << "'!\n";
return 0;
}
for (std::string buffer; std::getline(in, buffer); ++nLines);
std::cout << "File: '" << fileName << "', " << nLines << " counted.\n";
return nLines;
}

int main(int argc, char **argv)
{
unsigned nLines = 0;
for (int i = 1; i < argc; ++i) {
const std::string arg = argv[i];
if (arg == "-") {
nLines += process(arg, std::cin);
std::cin.clear();
} else {
std::ifstream fIn(arg.c_str());
nLines += process(arg, fIn);
}
}
std::cout << "Total: " << nLines << " counted.\n";
return 0;
}

cygwin64 中编译和测试:

$ g++ -std=c++11 -o line-count line-count.cc

$ ./line-count line-count.cc - line-count.cc -
File: 'line-count.cc', 32 counted.
1
2
3
File: '-', 3 counted.
File: 'line-count.cc', 32 counted.
1
2
3
File: '-', 3 counted.
Total: 70 counted.

$

所以,这确实是 std::cin.clear() 的诀窍这会重置输入流中的 EOF 标志,并可以从 /dev/stdin 中再次读取。

对于 OP,std::cin.ignore() std::cin.clear() 之后是恕我直言错误。它丢弃重新启用的标准输入的第一个字符,这使得以下处理错误(不计算第一个字符)。

戴维斯(再次)提供了一个简短但明显的解释,我用我的话说:

使用 CtrlD 时,标准输入在下一次尝试读取时收到 EOF;并将其存储在其内部标志中。然而,标志可以被重置。如果没有任何进一步的输入,下一次读取尝试将失败,否则,可以继续输入。

也许,值得强调 std::ios 中的内部 EOF 标志。没有std::cin.clear() ,即使有更多输入可用,读取尝试也会失败。只要内部 std::stream 标志没有导致良好状态,就不会在较低级别执行读取尝试,即使它可能会成功。

关于c++ - 在吃 EOF 后重用 std::cin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52324151/

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