Как проверить, связан ли 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()
3 ответа
Я нашел ответ на свой вопрос.
Прежде всего, я должен задать свой вопрос правильно.
Вопрос, который я хочу задать: как выяснить, связан ли std:: cin с терминалом или каналом.
В Windows:
_isatty( _fileno(stdin) );
На POSIX:
isatty( fileno(stdin) );
В Windows:
_isatty
вызвать возвращаемое ненулевое значение, если stdin связан с символьным устройством.
На POSIX:
isatty
call возвращает 1, если stdin ссылается на терминал.
isatty man для Linux: http://man7.org/linux/man-pages/man3/isatty.3.html
_isatty человек на MSDN: http://msdn.microsoft.com/en-us/library/f4s0ddew.aspx
Из обращения 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),
Нет другого способа (в основном), чтобы определить, есть ли у cin (будет) доступный символ (хотя некоторые протоколы могут обрабатывать пользовательский ввод).