【问题标题】:Read from STDIN unless it's empty从 STDIN 读取,除非它是空的
【发布时间】:2015-07-29 03:35:42
【问题描述】:

我需要用 c 语言编写一个程序来读取和解析 STDIN。这是我的问题:我已经在 STDIN 中处理了几个错误案例(格式错误等),但如果没有提供任何内容,程序会继续监听用户输入。我希望它抛出一个错误,例如“Nothing to read”。这可能吗?

【问题讨论】:

    标签: c


    【解决方案1】:

    如果您在类似 UNIX 的操作系统下,您可以使用select() 等待预定时间输入,如果没有,则继续。

    等待来自大量不同文件描述符的输入非常方便,但如果您愿意,也可以很容易地单独用于标准输入。

    或者,如果您确定它来自终端,您可以查看终端功能,使用 tcgetattr()tcsetattr() 将终端置于非规范模式并设置超时:

    #include <termios.h>
    struct termios tio;
    tcgetattr(fd, &tio);             // Get current
    tio.c_lflag &= ~ICANON;          // Non-canonical
    tio.c_cc[VTIME] = 50;            // Five second timeout
    tcsetattr(fd, TCSANOW, &tio);    // Set new
    

    遗憾的是,标准 (ISO) C 并没有强制要求。

    【讨论】:

      【解决方案2】:

      您的问题,如措辞,没有意义。如果输入来自类似管道的东西,则不可能知道更多输入到达之前需要多长时间。 (并且写入另一端将失败,直到有读者,尽管通常父进程仍会被视为读者,即使它实际上并没有尝试读取)。

      但是,如果您只想在输入是交互式时防止挂起,则只需使用isatty(3) 并且在这种情况下不要阅读。

      【讨论】:

      • 所以如果我应该从管道输入中读取但没有任何管道传输,我别无选择,只能抛出那个无用的无限提示?
      • @KiJéy 如果管道的写入端调用closeread 将返回0
      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 2020-04-18
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 2012-08-11
      • 1970-01-01
      • 2015-07-24
      相关资源
      最近更新 更多