我正在为我的操作系统课程编写模拟器.我遇到的问题是我们需要从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,则终止.
还有其他解决方案吗?这是便携式解决方案吗?
我不认为有一种独立于平台的方法可以做到这一点,但在基于 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)
但是,我认为通过命令行选项执行此操作是首选方法。