Как проверить, связан ли std :: cin с терминалом или каналом

0

Как можно проверить, связан ли буфер std :: cin с терминалом или каналом?

Командная строка, которая показывает, что std :: cin связан с файлом:

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

Командная строка, которая показывает std :: cin, связанный с терминалом:

Application.exe

Я попытался проанализировать in_avail() для этой цели. Но это не помогло.

std::cin.rdbuf()->in_avail()
  • 2
    Попробуйте заглянуть, если есть что почитать?
  • 0
    Если читать нечего, std :: cin ожидает ввода символа
Показать ещё 2 комментария
Теги:
io
cin
istream

3 ответа

2

Из ссылки std::istream::peek:

Если good() == true, возвращает следующий символ, полученный rdbuf()->sgetc() В противном случае возвращает Traits::eof().

Это означает, что он либо вернет следующий доступный символ, либо флаг eof.

И если, если потребуется, underflow функцию underflow буферов, которая заполняет буфер, если есть что-то, что можно прочитать из операционной системы.

1

Я нашел ответ на свой вопрос.

Прежде всего, я должен задать свой вопрос правильно.
Вопрос: Я хочу спросить: как выяснить, связан ли 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

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) требуется <ctrl-d>, чтобы остановить чтение.

Нет другого пути (в основном), чтобы определить, имеет ли cin (получит) доступный символ (хотя некоторый протокол может обрабатывать ввод пользователя).

  • 0
    Почему вы не можете просто проверить, является ли первый символ Traits::eof() ? bool empty = (std::cin.get() == Traits::eof()) .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню