【问题标题】:Is there are a way to find out whether the input is streaming into the program from a file or not?有没有办法找出输入是否从文件流入程序?
【发布时间】:2012-03-18 16:10:44
【问题描述】:

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

someprogram.exe < input.txt

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

【问题讨论】:

  • read by another file 是什么意思?您的意思是要检查输入是否来自file via the console?喜欢你的例子吗?
  • 如果您想检测程序的标准输入和输出是否连接到控制台 (TTY) 或管道,那么您就不走运了:没有标准(且非 hackish)在 C++ 中执行此操作的方法。

标签: c++


【解决方案1】:

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

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
}

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

【讨论】:

  • pstream 可能是引用类型,如果您使用条件运算符对其进行初始化。
  • @Emile:不,这会产生问题。您不能有条件地将现有变量或临时变量分配给引用。现有变量将被复制(const-ref,不可复制 iostreams 的错误)或移动(rvalue ref)。如果两个操作数是完全相同的类型和值类别,则条件运算符仅保留类型标识。在这种情况下,它们不是(左值与纯右值或 xvalue 与纯右值),使表达式的类型成为纯右值类别的非引用 std::istream 类型(两个操作数的通用类型)。
  • @Xeo:我不了解所有价值类别业务,但这在 GCC 4.7 中运行良好,具有预期的行为:std::istream &amp; stream = (argc &gt; 1) ? (fin.open(argv[1]),fin) : std::cin;
  • 据此 (stackoverflow.com/questions/9200087/…),问题是当您尝试使用 r 值表达式初始化非常量引用时。
  • @Emile:那是完全不同的事情。本杰明:啊,是的,如果你事先创建了std::ifstream 变量,那就可以了。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 2021-10-23
    • 2010-09-30
    相关资源
    最近更新 更多