【发布时间】:2018-09-14 02:22:10
【问题描述】:
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),也不管用。
【问题讨论】:
-
一旦你EOF
cin,我认为你不能把它带回来。如果可以的话,那就是通过一些神秘的黑魔法。最好为循环使用不同的终止条件,而不是杀死cin。 -
这很奇怪。您可以在什么操作系统和外壳上执行此操作。我尝试使用
wc - - <<EOF进行复制并输入a b c和EOF。我得到了1 3 6 -、0 0 0 -、1 3 6 total。 (我在 Windows 10 中使用cygwin64并使用bash。) -
顺便说一句。在尝试复制之前,我查看了
wc的一些来源,例如wc.c找到类似“诀窍”的东西,但我找不到任何可疑或令人惊讶的东西。 (而且,因此我想知道我是否还有其他东西......) -
@Scheff 我可以在 Windows 和 Arch Linux 的 Ubuntu 子系统上重现这个。
-
@Scheff:我想在回答之前测试一些东西,但我可以解释说,here-document (
<<EOF) 的行为是完全不同的,因为它没有t 涉及终端。