Search code examples
c++c++11posix

How to know when there is input through the terminal pipe line on C++ 11?


How to know when there is input through the terminal pipe line on C++ 11?

I may call my program like this:

1. ./main solved.txt
2. cat unsolved.txt | ./main
3. cat unsolved.txt | ./main solved.txt

I am using this to know whether I need to read data from the pipe line or not on 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() );
    }
}

But now I want to use the C++ 11 Standard, and my loved fileno and isatty are out of it. So there is an alternative to them on the C++ 11?

Related threads:

  1. checking data availability before calling std::getline
  2. Why does in_avail() output zero even if the stream has some char?
  3. Error "'fdopen' was not declared" found with g++ 4 that compiled with g++3
  4. stdio.h not standard in C++?
  5. error: ‘fileno’ was not declared in this scope
  6. GoogleTest 1.6 with Cygwin 1.7 compile error: 'fileno' was not declared in this scope

The problem is that when compiling with the -std=C++11, the fileno and isatty are undefined on the stdio.h/cstdlib because they are POSIX stuff. So, one solution would be to use -std=GNU++11 instead of -std=C++11. But is it possible to write something else to compile using the -std=C++11?


Solution

  • C++ POSIX Standard

    As far as I know, there is no such thing. There is a C POSIX library, which is part of POSIX standard.

    So there is an alternative to them on the C++ 11?

    There is no alternative in standard C++ (not before C++11, so far not after either).

    You will need to depend on POSIX to get the functionality that you need.

    Even in POSIX, it is the unistd.h which defines isatty. You've neglected to include it in your program.