C++ 有没有办法确定输入是否从文件流到程序中?

C++ 有没有办法确定输入是否从文件流到程序中?,c++,C++,在Windows中,存在一个控制台技巧 someprogram.exe < input.txt someprogram.exe1)?(财务公开(argv[1]),财务:标准::cin根据这个(),问题是当你试图用一个r值表达式初始化一个非常量引用时。@Emile:那是完全不同的事情。本杰明:啊,是的,如果你事先创建std::ifstream变量,那就行了。pstream如果你使用条件运算符初始化它,它可能是一个引用类型。@Emile:不,那会出问题的。不能有条件地将现有变量或临时变量分配

在Windows中,存在一个控制台技巧

someprogram.exe < input.txt
someprogram.exe
这使得程序可以在有输入请求时从input.txt获取输入。 当从另一个文件读取输入时,我希望我的程序表现不同。有没有办法做到这一点?怎么做?

我不这么认为(虽然不确定),但这里有一个替代方案(省略错误检查):

然后将文件名作为命令行参数传递。

我不这么认为(虽然不确定),但这里有一个替代方法(省略错误检查):


然后将文件名作为命令行参数传递。

是的,使用大多数平台上可用的函数
isatty
。看起来它现在在windows中被称为
\u isatty
(不知道为什么)。

是的,使用大多数平台上可用的功能
isatty
。看起来它现在在windows中被称为
\u isatty
(不知道为什么)。

被另一个文件读取
是什么意思?您的意思是要通过控制台检查输入是否来自
文件?就像你的例子一样,如果你想检测程序的标准输入和输出是否连接到控制台(TTY)或管道,你就不走运:C++中没有标准的(非哈希的)方式。您的意思是要通过控制台检查输入是否来自
文件?比如你的例子?如果你想检测程序的标准输入和输出是否连接到控制台(TTY)或管道,你就不走运:在C++中没有标准的(和非哈希的)方式。<代码> pSturt可以是引用类型,如果你使用条件运算符来初始化它。@埃米尔:不,这会造成问题。不能有条件地将现有变量或临时变量分配给引用。现有变量将被复制(const ref,错误与不可复制的iostreams)或移动(rvalue ref)。仅当两个操作数的类型和值类别完全相同时,条件运算符才保留类型标识。在本例中,它们不是(左值对prvalue或xvalue对prvalue),使表达式类型成为prvalue类别的非引用
std::istream
类型(两个操作数的常见类型)。@Xeo:我不知道所有的值类别业务,但这在GCC 4.7中运行良好,具有预期的行为:
std::istream&stream=(argc>1)?(财务公开(argv[1]),财务:标准::cin根据这个(),问题是当你试图用一个r值表达式初始化一个非常量引用时。@Emile:那是完全不同的事情。本杰明:啊,是的,如果你事先创建
std::ifstream
变量,那就行了。
pstream
如果你使用条件运算符初始化它,它可能是一个引用类型。@Emile:不,那会出问题的。不能有条件地将现有变量或临时变量分配给引用。现有变量将被复制(const ref,错误与不可复制的iostreams)或移动(rvalue ref)。仅当两个操作数的类型和值类别完全相同时,条件运算符才保留类型标识。在本例中,它们不是(左值对prvalue或xvalue对prvalue),使表达式类型成为prvalue类别的非引用
std::istream
类型(两个操作数的常见类型)。@Xeo:我不知道所有的值类别业务,但这在GCC 4.7中运行良好,具有预期的行为:
std::istream&stream=(argc>1)?(财务公开(argv[1]),财务:标准::cin根据这个(),问题是当你试图用一个r值表达式初始化一个非常量引用时。@Emile:那是完全不同的事情。本杰明:啊,是的,如果你事先创建
std::ifstream
变量,那就行了。
int main(int argc, char **argv)
{
    std::istream * pstream = &std::cin;

    std::ifstream fin;
    if (argc > 1)
    {
        fin.open(argv[1]);
        pstream = &fin;
    }

    // use pstream instead of cin
}