【问题标题】:C/C++ add input to stdin from the program?C/C++ 将输入从程序添加到标准输入?
【发布时间】:2009-07-05 13:15:50
【问题描述】:

这可能吗?

假设代码有很多 scanf 行。不是在调试时手动运行和手动添加值,是否可以向标准输入“馈送”数据,以便当 scanf 开始读取时,它会读取输入的数据而无需与终端交互。

【问题讨论】:

  • 作为Li-chih Wu's answer 的补充。 dup 函数不再接受 2 个参数,在撰写此答案时它已重命名为 dup2

标签: c++ c input stdin


【解决方案1】:

将测试行放到一个文件中,然后像这样运行程序:

myprogram < mytestlines.txt

比破解你的程序以某种方式自己做到这一点要好。

在调试代码时,您可以设置调试器以使用该命令行运行它。

【讨论】:

    【解决方案2】:

    为了使您的程序更加通用,您可能需要考虑重写您的程序以使用fscanffprintf 等,这样它就可以处理文件 IO 而不仅仅是控制台 IO;那么当您想从标准输入读取或写入标准输出时,您只需执行以下操作:

    FILE *infile, *outfile;
    
    if (use_console) {
        infile = stdin;
        outfile = stdout;
    } else {
        infile = fopen("intest.txt", "r");
        outfile = fopen("output.txt", "w");
    }
    fscanf(infile, "%d", &x);
    fprintf(outfile, "2*x is %d", 2*x);
    

    因为程序多久只处理标准输入/标准输出而不允许文件?特别是如果您最终在 shell 脚本中使用您的程序,在命令行上指定输入和输出会更加明确。

    【讨论】:

    • 这是一个很好的建议。非常感谢,我一定会在未来的实施中尝试这一点。谢谢。
    【解决方案3】:
    int fd[2];
    pipe(fd);
    close(0); // 0:stdin
    dup(fd[0], 0); // make read pipe be stdin
    close(fd[0]);
    fd[0] = 0;
    
    write(fd[1], "some text", 9); // write "some text" to stdin
    

    【讨论】:

    • 无论这是否是 OP 的问题,这对我非常有帮助,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2013-06-12
    • 2017-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    • 2011-11-15
    • 1970-01-01
    相关资源
    最近更新 更多