代码之家  ›  专栏  ›  技术社区  ›  Tzunghsing David Wong

在OS/X上Control-D之后如何继续从stdin读取

  •  0
  • Tzunghsing David Wong  · 技术社区  · 9 年前

    我希望使用EOF终止读取批量用户输入,但仍然能够接受用户CLI输入。

    Linux似乎允许这种行为,但OS/X只是关闭stdin输入流(从下面的测试程序中可以看出)。

    有什么变通方法可以让它在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;
    }
    
    1 回复  |  直到 9 年前
        1
  •  1
  •   CRD    9 年前

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

    高温