Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Shell 将Stdin和Stdout重定向到文件_Shell_Redirect_Batch File_Stdout_Stdin - Fatal编程技术网

Shell 将Stdin和Stdout重定向到文件

Shell 将Stdin和Stdout重定向到文件,shell,redirect,batch-file,stdout,stdin,Shell,Redirect,Batch File,Stdout,Stdin,我目前是一个C入门班的助教。这门课是用Visual Studio教授的,但在评分时,我只使用一个简单的Windows批处理脚本来处理所有提交的作业,编译它们,在测试文件上运行它们,并将输出重定向到一系列文本文件,我可以打印出来,标记,然后交还给学生。整个过程运行得很好,除了当我重定向stdin时,它不会像直接在控制台中键入相同的stdin时那样出现在重定向的stdou中。因此,为控制台格式化的代码输出不能正确显示在重定向的输出中。以下文件片段显示了此问题。有人知道一个简单的解决方案吗 文件:ex

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

文件:example.c

#include <stdio.h>

int main()
{
    int v;
    printf("Enter a number: ");
    scanf("%i", &v);
    printf("You entered: %d\n", v);
    return 0;
}
输出(控制台)

输出(重定向)

C:\>example.exeoutput.txt
C:\>more output.txt
输入一个号码:您输入的号码:42
C:\>
这是预期的(正确的)行为。输入永远不是标准输出的一部分。如果您执行
example.exe>output.txt
并盲目地键入42,您应该预期42在输出中也只显示一次


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

我意识到我看到的行为是正确的。我想做的是用脚本来模拟控制台设置的行为。您有没有关于如何使用POSIX实现这一点的简短示例?(我以前曾广泛使用Cygwin/*nix,如果需要的话,使用这两种方法都没有问题。)这里有一个很好的例子,可以使用重定向和exec进行分叉:如果您不知道如何创建文件desc。可以将其传递给重定向,可以尝试使用UNIX管道。
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:\>