如何知道C ++ 11上何时通过终端管道输入?

时间:2016-10-29 21:03:35

标签: c++ c++11 posix

如何知道何时通过C ++ 11上的终端管道输入?

我可以这样称呼我的程序:

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

我正在使用它来知道我是否需要在C POSIX标准上读取管道数据:

#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() );
    }
}

但是现在我想使用C ++ 11标准版,而我所爱的filenoisatty已经不在了。那么在C ++ 11上有一个替代方案吗?

相关主题:

  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
  7. 问题是,在使用-std=C++11进行编译时,fileno上的isattystdio.h/cstdlib未定义,因为它们是POSIX内容。因此,一种解决方案是使用-std=GNU++11而不是-std=C++11。但是可以使用-std=C++11编写其他东西进行编译吗?

2 个答案:

答案 0 :(得分:8)

  

C ++ POSIX标准

据我所知,没有这样的事情。有一个 C POSIX库,它是POSIX标准的一部分。

  

所以在C ++ 11上有替代它们吗?

标准C ++中没有其他选择(不是在C ++ 11之前,到目前为止都没有)。

您需要依赖POSIX来获得所需的功能。

即使在POSIX中,unistd.h定义了isatty。你忽略了将它包含在你的程序中。

答案 1 :(得分:2)

我不知道一种完全可移植的方法。据我所知,标准C ++不知道它的输入来自哪里,所以如果你正在使用posix系统,你应该只使用isatty