首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何判断STDIN是否为空?

如何判断STDIN是否为空?
EN

Stack Overflow用户
提问于 2011-05-04 17:18:48
回答 4查看 5.3K关注 0票数 7

我正在为我的操作系统课程写一个模拟器。我遇到的问题是,我们需要从STDIN获取所有的.job文件(它们就像输入到仿真器的应用程序)并读取它们。

呼叫:

代码语言:javascript
运行
复制
./RMMIX < aJob.job

我只是用低沉的声音

代码语言:javascript
运行
复制
while(getline(std::cin, line)) 

一行接一行。问题是,如果我没有把任何东西放到STDIN中,那么cin将等待用户输入--而不是我想要的。我需要程序在STDIN上识别缺少文本并终止,而不是等待用户输入。

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

代码语言:javascript
运行
复制
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,则终止。

有没有其他的解决方案?这是一个便携的解决方案吗?

EN

回答 4

Stack Overflow用户

发布于 2011-05-04 17:59:05

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

代码语言:javascript
运行
复制
#include <unistd.h>
...

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

    ...
}

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

票数 4
EN

Stack Overflow用户

发布于 2011-05-04 18:04:33

你需要重新设计你的程序。不是从标准输入中读取,而是从指定的文件中读取,即您在命令行中提供的姓名。然后,不是:

代码语言:javascript
运行
复制
./RMMIX < aJob.job

你可以说:

代码语言:javascript
运行
复制
./RMMIX aJob.job

与尝试确定标准输入中是否有任何内容相比,这要容易得多,也更具可移植性。

票数 2
EN

Stack Overflow用户

发布于 2011-05-04 18:11:34

您还可以从这个http://www.programmersheaven.com/mb/CandCPP/232821/232821/non-blocking-reads-on-stdin/中寻找来自另一个方向的问题的想法--不要检查流上的字节数,而只是立即使读取成功,然后检查是否读取了任何内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5881203

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档