【问题标题】:Do I need to change stdin if I initial use 'filename' as stdin and then I need to go back to traditional consol stdin?如果我最初使用“文件名”作为标准输入,然后我需要回到传统的 consol 标准输入,是否需要更改标准输入?
【发布时间】:2014-03-03 22:42:42
【问题描述】:

./dataset 

//我将数据读入文件并存入数组...

...

// 这里我需要向用户询问一个数字,但是程序总是跳过用户输入并继续...

字符答案; 答案 = getchar(); // 总是跳过 getchar()

【问题讨论】:

    标签: input stdin


    【解决方案1】:

    不,这不是这样做的方法。不知道它是否会起作用,但是打开文件、阅读文件并保留标准输入以供您与用户交互不是更容易吗?

    FILE *yourinputfile;
    
    yourinputfile=fopen("whatevernamethefilehas","r");
    // read with the appropriate routines, eg fscanf
    
    fclose (yourinputfile);
    
    char answer; answer = getchar(); // won't skip now
    

    您会注意到,C 中的所有输入例程都有一个读取标准输入的“速记”变体,以及一个以f 开头的变体,可以读取文件

    • scanf 和 fscanf
    • gets 和 fgets

    手册页是你的朋友 :)

    【讨论】:

    • 是的,这会更容易,但老师喜欢把它复杂化......我明白你的建议,我就是不能这样做......我需要像这样重定向文件这个 ./dataset
    • 这里有几个相关的问题,比如stackoverflow.com/questions/584868/…,也许这会有所帮助?虽然仍然不认为这是一个好主意,但如果这是教授想要的,那么你没有太多选择......
    【解决方案2】:

    如果你被允许使用并发,你可以在你的子进程中 fork() 一个新进程和 dup2() stdin 到一个新的文件描述符。您要确保不要在主进程上使用 dup2() 标准输入,否则您将失去从标准输入读取的能力。

    如果这似乎是正确的方向细节,很高兴能详细说明

    编辑:您能分享一下您是如何“停止”从传统标准输入读取的吗?我很困惑,因为通常从文件中读取不应阻止您从标准输入中读取。

    Edit2 - 我认为 fvu 是对的,如果您查看链接到您的页面,则有一个答案是关于使用 dup2() 将标准输入文件描述符复制到临时文件描述符,替换标准输入的文件描述符用别的东西,然后用它的临时副本再次替换它。这听起来像你要找的东西

    【讨论】:

    • 我不确定 fork() 是否会这样做...我不想重复该过程,只是为了停止从“文件名”读取并再次从“传统”标准输入开始读取跨度>
    猜你喜欢
    • 2017-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 2013-09-18
    • 1970-01-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多