通过stdin检查文件是否存在(C)

时间:2013-05-18 06:01:18

标签: c

我在用C编写函数时遇到困难,该函数检查用户输入的文件(通过stdin)是否存在。例如,如果程序以./a.out <myfile.txt运行,我希望如果此文件不存在则返回false。我可以通过使用./a.out myfile.txt将文件作为参数传递(即fopen()),但不确定如何使用'stdin'(即./a.out <myfile.txt

来执行此操作

好澄清:

较大的程序应该获取文本文件的内容并对其执行操作。该程序必须在命令行中以./a.out arg1 arg2 <myfile.txt运行。如果用户将程序作为./a.out arg1 arg2./a.out运行(即没有指定要执行操作的文件),我想提示用户包含一个文件(使用stdin <,未通过作为一个论点)。

5 个答案:

答案 0 :(得分:3)

Stdin可能根本不是来自文件。即使它是,当用户在命令行键入“&lt; myfile.txt”时,shell会吞下该部分命令,并且永远不会将其传递给程序。就程序而言,它是一个匿名的字节流,可能来自文件,设备,终端,管道或其他东西。可以查询您拥有哪些,​​但即使您知道它是一个文件,您也不会获得命令行上给出的文件的名称,只有inode。

答案 1 :(得分:2)

由于shell负责打开文件以进行重定向,因此如果文件没有打开,它将拒绝执行命令。

答案 2 :(得分:2)

输入重定向是由 shell完成的,不是你的程序。它只是将文件附加到标准输入。

因此,如果您尝试从不存在的文件重定向输入, shell 应该抱怨,甚至不能运行您的程序,如下面的记录所示:

pax> echo hello >qq.in

pax> cat <qq.in
hello

pax> cat <nosuchfile.txt
bash: nosuchfile.txt: No such file or directory

在任何情况下,您的程序通常都不会知道输入来自哪里,因为您可以执行以下操作:

echo hello | cat

其中涉及 no 文件。


如果您希望程序检测到文件的存在,则必须打开文件本身,这意味着您应该将文件名作为参数而不是使用标准输入。

或者,您可以在运行程序之前检测文件是否存在,类似于以下bash段:

fspec=/tmp/infile
if [[ -f ${fspec} ]] ; then
    my_prog <${fspec}
else
    echo What the ...
fi

答案 3 :(得分:1)

操作系统阻止调用您的程序,因为如果stdin不存在,它可以提供有效的myfile.txt。您的程序将无法运行,因此无法通知您文件丢失,并且此诊断程序在操作系统级别完成。

答案 4 :(得分:0)

  

如果用户以./a.out arg1 arg2或./a.out运行程序(即没有指定要执行操作的文件),我想提示用户包含一个文件(使用stdin&lt;,不作为参数传递。)

您可以使用特定于操作系统的函数来检查stdin是否为终端。检查它的文件是否是一个非常糟糕的主意,因为管道输入stdin是非常有用的...事实上,这是首先存在stdin这样的东西的一个主要原因。如果您只想读取文件而不是终端或管道,那么您应该将文件名作为必需参数,而不是从原始stdin读取(您仍然可以使用freopen从stdin读取)。如果你坚持认为你不想这样做,那么我会坚持你想做错了。