【问题标题】:How to change stdin back to reading from terminal after using "freopen" (in C)?使用“freopen”(在C中)后如何将stdin改回从终端读取?
【发布时间】:2019-11-23 08:44:12
【问题描述】:

我使用 freopen 将标准输入重定向到从文件中读取,并且效果很好

FILE *fp = freopen(args[index + 1], "r", stdin);
        if(fp == NULL){
            printf("file not found\n");
            return 1;
        }

之后我做了一些处理并想回到从终端读取,但我似乎不知道该怎么做。

我正在使用 fclose

关闭文件
fclose(fp);

我也尝试关闭 stdin,但没有任何作用。

fclose(stdin);

我试过了

int savedStdIn = dup(0);

在 freopen 和

之前
dup2(savedStdIn, 0);

在代码的末尾(与 fclose(fp) 一起)但这也不起作用。

【问题讨论】:

    标签: c stdin


    【解决方案1】:

    你很亲密:

    // before reopen
    int savedStdIn = dup(fileno(Stdin));
    freopen(...) ;
    ...
    // restore stdin
    fclose(Stdin) ;
    stdin = fdopen(savedStdIn, “r”)
    ...
    

    理论上,只要刷新缓冲区,close/dup 方法就可以工作。这是有风险的,并且依赖于实现,因为它试图通过访问系统调用来绕过工作室库调用。

    // before reopen
    int savedStdIn = dup(fileno(Stdin));
    freopen(...) ;
    ...
    // restore stdin
    fflush(stdin):
    Dup2(SavedstdIn), fileno(stdin))
    

    【讨论】:

    • stdin/stdout 并不总是可重新分配。
    猜你喜欢
    • 1970-01-01
    • 2013-02-26
    • 2021-05-14
    • 2015-11-12
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多