所以我有一个项目需要我做类似的事情:
./test < input.txt
但不是所有的时间。该程序也可以运行:
./test
两者之间有一些不同的代码。我无法在代码中区分这两者。例如,两者的argc值均为1.
判断命令行中是否有输入文件的最佳方法是什么?
答案 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。
您甚至可能想要考虑批量调用(即at
或crontab
个作业)和后台作业的情况。
为此,您还可以查看环境,请参阅here documents。另请阅读environ(7)有关控制终端和会话(credentials(7))和setsid(2)的信息。另请参阅/dev/tty
(所以job control,termios(3)和tty(4)。顺便说一句,你也可以关心 stdout 或 stderr 是否被重定向。
我建议能够通过明确的程序参数来克服这种自动检测,因为它存在极端情况,因为它不是完美的(mytest < /dev/stdin
和mytest < /dev/tty
怎么样?你认为这些吗?作为要检测的重定向?)。关于程序参数有tty demystified。
很少有程序正在进行这样的自动检测,而那些正在通过程序参数提供方法来克服它(例如,ls --color
和emacs -nw
)。
答案 1 :(得分:0)
<
运算符用于输入重定向。这只是意味着在<
之后指定的文件替换了该程序的stdin
。
您拥有的另一种方法不会替换stdin,因此从。
读取正常的stdin文件在这两种情况下,你仍在阅读stdin,所以不用担心,所以你可能想要仔细检查实际要求是什么。