如何检查std :: cin是否与终端或管道相关联

时间:2013-11-28 18:05:07

标签: c++ io cin istream

如何检查std :: cin缓冲区是否与终端或管道相关联?

显示std :: cin与文件关联的命令行:

Application.exe < C:\output.txt > C:\result.txt

显示与终端关联的std :: cin的命令行:

Application.exe

我试图为此目的分析in_avail()。但它没有帮助。

std::cin.rdbuf()->in_avail()

3 个答案:

答案 0 :(得分:2)

来自reference of std::istream::peek

  

如果good() == true,则返回rdbuf()->sgetc()获取的下一个字符,否则返回Traits::eof()

这意味着它将返回下一个可用字符或eof标志。

如果需要,如果需要,会导致调用底层缓冲区underflow函数,如果有任何东西要从操作系统中读取,它将填充缓冲区。

答案 1 :(得分:1)

这适用于文件输入(和用户输入):

#include <iostream>
#include <sstream>

int main(int argc, const char * argv[])
{
    typedef std::istream::traits_type Traits;
    std::stringstream buffer;
    Traits::int_type ch;
    while((ch = std::cin.get()) != Traits::eof()) {
        buffer << Traits::to_char_type(ch);
    }
    std::cout << buffer.str();
}

在(linux)终端中具有用户输入a&lt; ctrl-d&gt;需要停止阅读。

没有其他方法(基本上)来检测cin是否有(将获得)可用的字符(虽然某些协议可以处理用户输入)。

答案 2 :(得分:1)

我找到了问题的答案。

首先,我必须以正确的方式提出我的问题。
问题我想问:如何判断std :: cin是否与终端或管道相关联。


在Windows上:

_isatty( _fileno(stdin) );

关于POSIX:

isatty( fileno(stdin) );


在Windows上:

如果stdin与char设备关联,则

_isatty调用retursn非零值。

关于POSIX:

如果stdin指的是终端,则

isatty调用返回1。


Linux的isatty man:http://man7.org/linux/man-pages/man3/isatty.3.html
MSDN上的_isatty man:http://msdn.microsoft.com/en-us/library/f4s0ddew.aspx