【发布时间】:2011-05-04 09:18:48
【问题描述】:
我正在为我的操作系统课程编写一个模拟器。我遇到的问题是我们需要从 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 则终止。
还有其他解决方案吗?这是便携式解决方案吗?
【问题讨论】:
-
如果不使用某些系统特定的代码,我认为您无法做到。如果 cin 连接到控制台,EOF 条件是我将按下 Ctrl+D/Ctrl+Z 作为我的下一个输入。系统只需要等到我输入内容才能做出决定!
-
流没有长度。它们是信息流,而不是容器。实际上,您是在询问
cin的读取缓冲区的填充部分的长度。 -
你的代码试图做的是有效地在管道中寻找,据我所知是未定义的。
-
如果您不使用
<重定向任何内容,那么标准输入中会有 的内容。用户输入。你必须< /dev/null。那么就什么都没有了,因为/dev/null总是空的。 -
您希望它等待用户输入。这就是现在所有期望标准输入数据的程序的行为,所以如果你的不同,你只会混淆要运行它的人。