Как проверить, связан ли 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 (будет) доступный символ (хотя некоторые протоколы могут обрабатывать пользовательский ввод).

Другие вопросы по тегам