【问题标题】:How to know if std::cin is from redirect?如何知道 std::cin 是否来自重定向?
【发布时间】:2013-12-25 11:08:22
【问题描述】:

假设我有一个像这样的小程序:

int main() 
{
    cout << "Please enter the param >" << endl; // <-- Print only if input from console
    std::string param;
    cin >> param;
    //Doing some calculations...
    cout << "result is..."
} 

我只想在输入来自控制台时打印参数请求,但如果程序以重定向 myApp.exe &lt; textfile.txt 启动,那么我认为打印它没有意义。

我怎样才能实现这种行为?

编辑 - 我在 Windows 上工作。

【问题讨论】:

  • 我猜如果你使用让我们说scanf(),你不会有这个问题,或者你会吗?
  • 由于您使用的是 Windows,因此您可能可以使用 _isatty
  • @khajvah - 不,scanf() 将导致相同的行为。 ):
  • @JoachimPileborg - 如果你把它写成答案,我会接受它(:
  • 我无法评论 Roee Gavirel's answer 因为 _isatty 有一些特殊性,如所述,例如,here。因此,最好使用GetConsoleMode 来代替它。特别是,GetConsoleMode 用于检测 Microsoft C 运行时库内部的控制台。

标签: c++ windows command-line std cin


【解决方案1】:

此答案基于@JoachimPileborg 评论

#include <io.h>
#include <stdio.h>
bool isInputRedirected()
{
    return (!(_isatty(_fileno(stdin))))
}

Original source in MSDN

【讨论】:

    【解决方案2】:

    检测重定向的技术手段取决于操作系统:C++ 标准库没有这方面的功能,AFAIK(虽然我可能弄错了)也没有 Boost。


    您可以做的最好的可移植性工作是为程序调用者提供方法来告诉它是否应该提供交互式接口,将责任传递给知道足够知识的部分来承担它。

    例如,您可以使用程序参数,和/或您可以将主要功能构建为从两个不同的前端程序调用的库。

    【讨论】:

      猜你喜欢
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-08
      相关资源
      最近更新 更多