【问题标题】:How to continue reading from stdin after Control-D on OS/X如何在 OS/X 上的 Control-D 后继续从标准输入读取
【发布时间】:2015-02-27 01:13:09
【问题描述】:

我想使用 EOF 来终止读取批量用户输入,但继续能够接受用户 CLI 输入。

Linux 似乎允许这种行为,但 OS/X 只是简单地关闭了标准输入输入流(如以下测试程序所示)。

是否有任何解决方法允许它在 OS/X 上运行?

在 MAC OS/X 上运行的示例输出。一旦检测到 EOF,就不能进行任何输入。 (以 >>> 开头的行是程序的输出)。

TDWONG-M-V08D:$ ./eof_stdin
>>> fgets: zzz
>>> ans=zzz

>>> read stdin again, fgets:
zzz
>>> ans=zzz

TDWONG-M-V08D:$ ./eof_stdin
>>> fgets: >>> ans=
>>> feof(stdin) is true -- EOF detected
>>> read stdin again, fgets:
>>> ans=

在 Linux 上运行的示例输出。即使在检测到 EOF 之后也接受输入。 (以 >>> 开头的行是程序的输出)。

[tdwong@tdwong-ubuntu tmp]$ ./eof_stdin
>>> fgets: zzz
>>> ans=zzz

>>> read stdin again, fgets:
zzz
>>> ans=zzz

[tdwong@tdwong-ubuntu tmp]$ ./eof_stdin
>>> fgets: >>> ans=
>>> feof(stdin) is true -- EOF detected
>>> read stdin again, fgets:
zzz
>>> ans=zzz

这是示例测试程序:

#include<stdio.h>
int main(void)
{
    char ans[80];
    //
    // read from stdin
    printf(">>> fgets: "); fflush(stdin);
    fgets(ans, sizeof(ans), stdin);
        printf(">>> ans=%s\n", ans);
    if (feof(stdin)) {
        printf(">>> feof(stdin) is true -- EOF detected\n");
    }
    //
    // continue read from stdin
    printf(">>> read stdin again, fgets: \n");
    fgets(ans, sizeof(ans), stdin);
        printf(">>> ans=%s\n", ans);
    return 0;
}

【问题讨论】:

    标签: macos stdin eof


    【解决方案1】:

    检测到 EOF 后,您可以调用 stdio 函数 clearerr(stdin)clearerr_unlocked(stdin) 来清除 stdin 流上的 EOF 状态 - man 3 clearerr 了解更多详细信息。

    HTH

    【讨论】:

    • 非常感谢。你的回答解决了我的问题。作为记录,我在检测到 EOF 后添加了“clearerr(stdin)”,并且可以继续读取 stdin 没有任何问题。
    猜你喜欢
    • 2021-08-03
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 2012-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多