假设我有一个程序接受来自键盘的输入,或者接受来自文件的重定向输入,这样:
#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/