Как узнать, когда есть вход через терминальную линию трубопровода на С++ 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.