如何确定STDIN是否为空?

IAE*_*IAE 7 c++ iostream

我正在为我的操作系统课程编写模拟器.我遇到的问题是我们需要从STDIN获取所有.job文件(它们就像应用程序被送到模拟器)并读取它们.

呼叫:

./RMMIX < aJob.job
Run Code Online (Sandbox Code Playgroud)

我只是啜饮它

while(getline(std::cin, line)) 
Run Code Online (Sandbox Code Playgroud)

逐行.问题是,如果我没有给STDIN任何东西,那么cin会等待用户输入 - 不是我想要的.我需要程序识别STDIN上缺少文本并终止,而不是等待用户输入.

我已经确定我可以像这样查询长度:

size_t beg = std::cin.tellg();
std::cin.seekg(0, std::ios_base::end);
size_t end = std::cin.tellg();
std::cin.seekg(0, std::ios_base::beg);
Run Code Online (Sandbox Code Playgroud)

如果std :: cin的长度为0,则终止.

还有其他解决方案吗?这是便携式解决方案吗?

ham*_*mar 4

我不认为有一种独立于平台的方法可以做到这一点,但在基于 Unix 的系统上你应该能够这样做:

#include <unistd.h>
...

int main() {
    if (!isatty(0)) {
        // stdin is being streamed from a file or something else that's not a TTY.
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,我认为通过命令行选项执行此操作是首选方法。

  • 这应该是“isatty(STDIN_FILENO)”或“isatty(fileno(stdin))”,如果是后者,则使用“-D_POSIX_SOURCE”进行编译。 (2认同)