Как можно проверить, связан ли буфер std :: cin с терминалом или каналом?
Командная строка, которая показывает, что std :: cin связан с файлом:
Application.exe < C:\output.txt > C:\result.txt
Командная строка, которая показывает std :: cin, связанный с терминалом:
Application.exe
Я попытался проанализировать in_avail() для этой цели. Но это не помогло.
std::cin.rdbuf()->in_avail()
Если
good() == true
, возвращает следующий символ, полученныйrdbuf()->sgetc()
В противном случае возвращаетTraits::eof()
.
Это означает, что он либо вернет следующий доступный символ, либо флаг eof
.
И если, если потребуется, underflow
функцию underflow
буферов, которая заполняет буфер, если есть что-то, что можно прочитать из операционной системы.
Я нашел ответ на свой вопрос.
Прежде всего, я должен задать свой вопрос правильно.
Вопрос: Я хочу спросить: как выяснить, связан ли std :: cin с терминалом или каналом.
В Windows:
_isatty( _fileno(stdin) );
В POSIX:
isatty( fileno(stdin) );
В Windows:
_isatty
call retursn non zero value, если stdin связан с устройством char.
В POSIX:
isatty
call возвращает 1, если stdin ссылается на терминал.
isatty man для Linux: http://man7.org/linux/man-pages/man3/isatty.3.html
_isatty man в MSDN: http://msdn.microsoft.com/en-us/library/f4s0ddew.aspx
Это будет работать для ввода файлов (и ввода пользователя):
#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())
.