代码之家  ›  专栏  ›  技术社区  ›  Joseph Sturtevant

将Stdin和Stdout重定向到文件

  •  2
  • Joseph Sturtevant  · 技术社区  · 17 年前

    我目前是某大学的助教 C简介 类。这门课是用Visual Studio教的,但在评分时,我只使用一个简单的Windows批处理脚本来处理所有作业提交,编译它们,在测试文件上运行它们,并将输出重定向到一系列我可以打印、标记并交还给学生的文本文件。整个过程运行得很好,除了当我重定向stdin时,它在重定向的stdout中的显示方式与直接在控制台中键入相同的stdin时不同。因此,为控制台格式化的代码输出在重定向输出中无法正确显示。以下文件片段显示了此问题。有人知道一个简单的解决方案吗?

    文件:示例。c

    #include <stdio.h>
    
    int main()
    {
        int v;
        printf("Enter a number: ");
        scanf("%i", &v);
        printf("You entered: %d\n", v);
        return 0;
    }
    

    文件:input.txt

    42
    

    输出(控制台)

    C:\>example.exe
    Enter a number: 42
    You entered: 42
    
    C:\>
    

    输出(重定向)

    C:\>example.exe < input.txt > output.txt
    
    C:\>more output.txt
    Enter a number: You entered: 42
    
    C:\>
    
    1 回复  |  直到 17 年前
        1
  •  4
  •   ypnos    17 年前

    这是预期的(正确的)行为。输入永远不是stdout的一部分。如果你这样做 example.exe > output.txt 如果盲目地键入42,您应该期望42在输出中也只出现一次。

    我能想到的唯一解决方案是终端/shell将会话作为一个整体进行记录。Windows命令shell无法做到这一点。不过,您可以编写自己的终端代理,它将stdin馈送到学生的程序中并读取输出本身,同时以组合方式将两者写出。在POSIX(由Cygwin提供)下,很容易分叉执行另一个程序并重定向该程序的stdin/out,但我不知道普通的DOS/Windows。