如何检查std :: cin缓冲区是否与终端或管道关联?如何检查std :: cin是否与终端或管道相关联
命令行这表明的std :: CIN是与文件相关联:
Application.exe <C:\output.txt> C:\result.txt
命令行示出的std :: CIN与终端相关联:
Application.exe
我试图分析in_avail()为此目的。但它没有帮助。
std::cin.rdbuf()->in_avail()
如何检查std :: cin缓冲区是否与终端或管道关联?如何检查std :: cin是否与终端或管道相关联
命令行这表明的std :: CIN是与文件相关联:
Application.exe <C:\output.txt> C:\result.txt
命令行示出的std :: CIN与终端相关联:
Application.exe
我试图分析in_avail()为此目的。但它没有帮助。
std::cin.rdbuf()->in_avail()
从reference of std::istream::peek
:
如果
good() == true
,返回由rdbuf()->sgetc()
否则得到的下一个字符,则返回Traits::eof()
。
这意味着它将返回下一个可用字符或eof
标志。
如果需要,将导致底层缓冲区underflow
函数被调用,如果有任何操作系统需要读取该函数,它将填充缓冲区。
这将用于文件输入(和用户输入)工作:
#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)的端子的< CTRL-d需要>停止读取。
没有其他方式(基本上),检测cin是否有(将得到)一个可用的字符(虽然某些协议可以处理用户输入)。
为什么不能只检查第一个字符是否是Traits :: eof()? 'bool empty =(std :: cin.get()== Traits :: eof())'。 – 0x499602D2
我找到了我的问题的答案。
首先,我必须以正确的方式询问我的问题。
问题我想问:如何判断std :: cin是否与终端或管道关联。
在Windows上:
_isatty(_fileno(stdin));
在POSIX:
isatty(fileno(stdin));
在Windows上:
_isatty
呼叫retursn非零值,如果标准输入与字符设备相关联。
在POSIX:
isatty
调用返回1,如果标准输入指的是一个终端。
isatty人版:http://man7.org/linux/man-pages/man3/isatty.3.html
_isatty男子MSDN:http://msdn.microsoft.com/en-us/library/f4s0ddew.aspx
尝试[PEEK(http://en.cppreference.com/w/cpp/io/basic_istream/peek)如果有东西要读? –
如果没有东西要读,那么std :: cin会等待输入符号 –
'in_avail'如何无益? – 0x499602D2