Как узнать, когда есть вход через терминальную линию трубопровода на С++ 11?
Как узнать, когда есть вход через терминальную линию трубопровода на С++ 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=C++11
, fileno
и isatty
являются undefined на stdio.h/cstdlib
, потому что они являются файлами POSIX. Таким образом, одним из решений было бы использовать -std=GNU++11
вместо -std=C++11
. Но можно ли написать что-то еще для компиляции с помощью -std=C++11
?
Ответы
Ответ 1
С++ POSIX Standard
Насколько я знаю, такой вещи нет. Существует библиотека C POSIX, которая является частью стандарта POSIX.
Итак, есть альтернатива для них на С++ 11?
В стандартном С++ нет альтернативы (не до С++ 11, пока не после).
Вам нужно будет зависеть от POSIX, чтобы получить необходимую функциональность.
Даже в POSIX это unistd.h
, который определяет isatty
. Вы пренебрегли включением его в свою программу.
Ответ 2
Я не знаю полностью переносного способа сделать это. Насколько я знаю, стандартный С++ не знает информации о том, откуда он поступает, поэтому вы должны просто использовать isatty
, если вы работаете в системе posix.