Как узнать, когда есть вход через терминальную линию трубопровода на С++ 11?
Я могу назвать свою программу следующим образом:
1. ./main solved.txt
2. cat unsolved.txt | ./main
3. cat unsolved.txt | ./main solved.txt
Я использую это, чтобы узнать, нужно ли мне читать данные из линии трубопровода или нет на C POSIX Standard:
#include <iostream>
#include <sstream>
#include <stdio.h>
#include <unistd.h>
int main( int argumentsCount, char* argumentsStringList[] )
{
std::stringstream inputedPipeLineString;
if( argumentsCount > 1 )
{
printf( "argumentsStringList[1]: %s", argumentsStringList[ 1 ] );
}
// If it is passed input through the terminal pipe line, get it.
if( !isatty( fileno( stdin ) ) )
{
// Converts the std::fstream "std::cin" to std::stringstream which natively
// supports conversion to string.
inputedPipeLineString << std::cin.rdbuf();
printf( "inputedPipeLineString: %s", inputedPipeLineString.str().c_str() );
}
}
Но теперь я хочу использовать С++ 11 Standard, и мои любимые fileno
и isatty
не работают. Итак, есть альтернатива для них на С++ 11?
Связанные темы:
- проверка доступности данных перед вызовом std:: getline
- Почему in_avail() выводит ноль, даже если поток имеет несколько char?
- Ошибка "'fdopen' не была объявлена " найденный с g++ 4, который скомпилирован с g++ 3
- stdio.h не стандартно в С++?
- error: 'fileno не был объявлен в этой области
- GoogleTest 1.6 с ошибкой компиляции Cygwin 1.7: 'fileno' не был объявлен в этой области
Проблема заключается в том, что при компиляции с -std=C++11
, fileno
и isatty
являются undefined на stdio.h/cstdlib
, потому что они являются файлами POSIX. Таким образом, одним из решений было бы использовать -std=GNU++11
вместо -std=C++11
. Но можно ли написать что-то еще для компиляции с помощью -std=C++11
?