来自命令行的C ++输入文件

时间:2017-10-03 20:36:29

标签: c++

所以我有一个项目需要我做类似的事情:

./test < input.txt

但不是所有的时间。该程序也可以运行:

./test

两者之间有一些不同的代码。我无法在代码中区分这两者。例如,两者的argc值均为1.

判断命令行中是否有输入文件的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

没有一般方法,它是特定于操作系统的。我专注于Linux和POSIX系统。请注意,test是一个糟糕的名称(与keys冲突...),mytest < input.txt个静止图从stdin获取输入,因为test(1)redirection完成在使用shell启动mytest程序之前。

从文件中读取的通常方法是将其作为显式参数:mytest input.txt(然后测试argc)。我强烈建议有这样的约定。另请参阅execve(2),阅读getopt(3)

在Linux(或POSIX)上,您可以在STDIN_FILENO上使用program arguments和/或fstat(2)(即0),即使这不是防弹,例如适用于isatty(3)pipelines

您甚至可能想要考虑批量调用(即atcrontab个作业)和后台作业的情况。 为此,您还可以查看环境,请参阅here documents。另请阅读environ(7)有关控制终端和会话(credentials(7))和setsid(2)的信息。另请参阅/dev/tty(所以job controltermios(3)tty(4)。顺便说一句,你也可以关心 stdout stderr 是否被重定向。

我建议能够通过明确的程序参数来克服这种自动检测,因为它存在极端情况,因为它不是完美的(mytest < /dev/stdinmytest < /dev/tty怎么样?你认为这些吗?作为要检测的重定向?)。关于程序参数有tty demystified

很少有程序正在进行这样的自动检测,而那些正在通过程序参数提供方法来克服它(例如,ls --coloremacs -nw)。

答案 1 :(得分:0)

<运算符用于输入重定向。这只是意味着在<之后指定的文件替换了该程序的stdin

您拥有的另一种方法不会替换stdin,因此从。

读取正常的stdin文件

在这两种情况下,你仍在阅读stdin,所以不用担心,所以你可能想要仔细检查实际要求是什么。