![C++:如何从文件重定向到 cin 并显示,就像用户键入输入一样](https://linux22.com/image/72757/C%2B%2B%EF%BC%9A%E5%A6%82%E4%BD%95%E4%BB%8E%E6%96%87%E4%BB%B6%E9%87%8D%E5%AE%9A%E5%90%91%E5%88%B0%20cin%20%E5%B9%B6%E6%98%BE%E7%A4%BA%EF%BC%8C%E5%B0%B1%E5%83%8F%E7%94%A8%E6%88%B7%E9%94%AE%E5%85%A5%E8%BE%93%E5%85%A5%E4%B8%80%E6%A0%B7.png)
我有一个简单的 C++ 程序,用于cin
读取八个数字,并且在 bash shell 中运行它。当我在终端中运行它时,它看起来像这样(用户输入数字 1-8):
./add8
Please enter eight numbers: 1 2 3 4 5 6 7 8
The sum is: 36
我试图将具有八个数字(例如“1 2 3 4 5 6 7 8”和换行符)的文件重定向到程序,但输入未显示在屏幕上:
./add8 < my_eight_numbers.txt
Please enter eight numbers: The sum is: 36
是否可以将文件重定向到程序中和显示输入内容就像用户键入一样?
答案1
基本上,您需要确定终端中是否有标准输入,或者某种管道/重定向。为此,您可以使用该isatty
功能。
int main(void){
char buffer[N];
int sum;
/* Load buffer from stdin with fgets, fread, read, ... */
if(!isatty(fileno(stdin)))
printf("%s\n", buffer);
/* Compute sum... */
printf("The sum is %d.\n", sum);
}
在这种情况下,当 stdin 不是 tty(这意味着输入尚未输入)时,程序会在计算总和之前打印缓冲区。
在我的系统上,该isatty
函数在 中声明unistd.h
。您还需要stdio.h
获得fileno
.
答案2
C++ - 方法是(抱歉,我已经有一段时间没有用 C++ 编程了)
- 重载 ifstream '>>' - 运算符,以便在文件读取时也将所有字符输出到 stdout (ostream),并且
- 解析位置参数并将它们作为数组传递
- 使用重载的 ifstream 读取文件并计算结果
希望有帮助
答案3
普通终端会回显输入的内容。如果输入不是终端,但同时输出是终端,那么您想要做的似乎是模拟此行为。
您可以测试文件描述符是否引用终端伊萨蒂(3)。
无论如何,这样做(交互式 CLI 程序,使用 isatty)是非常违背 Unix 精神的。最好不要写这样的程序。如果可以的话,Cli 程序应该是过滤器。