我正在为我的操作系统课程写一个模拟器。我遇到的问题是,我们需要从STDIN获取所有的.job文件(它们就像输入到仿真器的应用程序)并读取它们。
呼叫:
./RMMIX < aJob.job我只是用低沉的声音
while(getline(std::cin, line)) 一行接一行。问题是,如果我没有把任何东西放到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);如果std::cin的长度为0,则终止。
有没有其他的解决方案?这是一个便携的解决方案吗?
发布于 2011-05-04 17:59:05
我不认为有一种独立于平台的方式来做到这一点,但在基于Unix的系统上,你应该能够做到:
#include <unistd.h>
...
int main() {
if (!isatty(0)) {
// stdin is being streamed from a file or something else that's not a TTY.
}
...
}但是,我认为通过命令行选项执行此操作是更好的方法。
发布于 2011-05-04 18:04:33
你需要重新设计你的程序。不是从标准输入中读取,而是从指定的文件中读取,即您在命令行中提供的姓名。然后,不是:
./RMMIX < aJob.job你可以说:
./RMMIX aJob.job与尝试确定标准输入中是否有任何内容相比,这要容易得多,也更具可移植性。
发布于 2011-05-04 18:11:34
您还可以从这个http://www.programmersheaven.com/mb/CandCPP/232821/232821/non-blocking-reads-on-stdin/中寻找来自另一个方向的问题的想法--不要检查流上的字节数,而只是立即使读取成功,然后检查是否读取了任何内容。
https://stackoverflow.com/questions/5881203
复制相似问题