C++:如何从文件重定向到 cin 并显示,就像用户键入输入一样

C++:如何从文件重定向到 cin 并显示,就像用户键入输入一样

我有一个简单的 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++ 编程了)

  1. 重载 ifstream '>>' - 运算符,以便在文件读取时也将所有字符输出到 stdout (ostream),并且
  2. 解析位置参数并将它们作为数组传递
  3. 使用重载的 ifstream 读取文件并计算结果

希望有帮助

答案3

普通终端会回显输入的内容。如果输入不是终端,但同时输出是终端,那么您想要做的似乎是模拟此行为。

您可以测试文件描述符是否引用终端伊萨蒂(3)

无论如何,这样做(交互式 CLI 程序,使用 isatty)是非常违背 Unix 精神的。最好不要写这样的程序。如果可以的话,Cli 程序应该是过滤器。

相关内容