c++ - std::cin 可以在运行时从接受文件输入切换到键盘输入吗?

标签 c++ cin io-redirection

假设我有一个程序接受来自键盘的输入,或者接受来自文件的重定向输入,这样:

#include <iostream>

using namespace std;

int main() {
  string str;
  while (getline(cin, str)) {
    if(str.compare("exit") == 0)
      return 0;
  }
  return 0;
}

在此实现中,我希望使用键盘输入的程序实例将在键入“exit”时终止,而使用文件输入的程序实例将在 EOF 时终止。

我想实现的功能是,如果正在运行的程序实例使用文件输入,它将在到达 EOF 时允许键盘输入,而不是终止。我做了一些研究,表明这不可能用 getline 作为 while 循环的条件,因为一旦文件输入结束它就会返回 false,而且我不知道有什么办法告诉 cin 我想在那个时候接受键盘输入。

那么,cin 是否可以在文件运行时从接受文件输入切换为接受键盘输入?如果不是,您能解释一下原因吗?

最佳答案

当然可以。 std::cin.rdbuf()函数可以将另一个 I/O 缓冲区重新分配给 cin。但是你必须先获得缓冲区。

当您使用 shell 将文件重定向到 stdin 时,该文件会替换键盘。 shell 负责将键盘连接到程序,所以现在你要靠自己了。 C++ 没有定义键盘接口(interface)。除非您想使用特定于平台的程序(可能不值得),否则程序的使用约定需要稍微改变一下。

最标准的解决方案是将输入文件添加为命令行选项。这可以很容易地作为 std::filebuf 缓冲区对象打开。将其传递给 std::cin.rdbuf(),并保存返回值。现在 std::cin 从文件中读取。完成后,将保存的值传递给 rdbuf 以将其恢复为原始 stdin 文件描述符,该文件描述符仍连接到键盘。

关于c++ - std::cin 可以在运行时从接受文件输入切换到键盘输入吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15625956/

相关文章:

c++ - 将字符串输入到 int 会在 c/c++ 中产生错误的输出

C++ - 使用 cin 运行 while 循环后,程序将不再接受输入

java - 输入重定向到键盘输入

Bash 写入文件没有 echo ?

c++ - 为 Qt 创建 moc 文件

c++ - 在一行上流式传输多个变量?

c++ - 使用发布 CRT 在调试中构建应用程序,但存在对 boost 的依赖性问题

bash - 将可执行进度条重定向到日志文件

c++ - STL 字符串比较仿函数

c++ - 通读文件中的字符并计算有多少个字母 [c++]