当用户在 shell 上使用“<”命令时,如何访问 C 中的文件?

How can I access the file in C when the user used the '<' command on the shell?

我正在尝试制作一个可以在 POSIX 环境中用 C 语言处理句子的程序。假设我的程序名称是“test”。如果用户只输入“./test”,那么我的程序会要求用户输入一些句子。这个到目前为止很简单。

但是,如果用户输入“./test < file.txt”,程序应该从那个 txt 文件中获取字符。我不知道如何在 C 中获取文件的字符。我尝试了类似 file = open(argv[2]); 的方法,但它没有用。

如果你能给我这个问题的答案,我将不胜感激。

TL;DR:如果您像

一样启动您的程序
./test

并且您必须输入输入内容,然后如果您以

启动它,将从 file.txt 中读取完全相同的程序
./test < file.txt 

更长的解释从这里开始。 (以下解释并非100%准确,但应该有助于了解原理。)

在 C 程序中,您可以使用 fopen 打开文件。作为一个 return 值,fopen 给你一个 FILE 指针。但是,当您在 Unix 下启动程序时,三个 FILE 指针已经可用。这些默认 FILE 指针存储在名为 stdinstdoutstderr.

的变量中

其中,stdin可用于读取,stdoutstderr可写入。并且,stdin 在多个 C 库调用中用作默认值,例如 getsscanf。同样,stdout 默认用于 printf.

等调用

现在,虽然它们被称为 FILE 指针,但实际上它们可以代表其他东西,而不仅仅是文件。 stdin 可以是一个文件,但也可以是一个控制台,您可以在其中输入内容。

后一种情况是您从 shell 使用命令

启动 test 程序时观察到的情况
./test

在这种情况下,测试过程将从 stdin 开始,只需使用您启动测试程序的 shell 的控制台。因此,如果在您的测试程序中调用 gets(),那么您的程序将隐式读取 stdin,它表示从 shell 继承的控制台输入。因此,在这种情况下,用户必须通过键入来提供输入。

现在让我们看看如果您按以下方式从 shell 开始您的进程会发生什么:

./test < file.txt

在这里,shell 在实际创建您的测试过程之前做了一些额外的工作。这是因为命令行的 < file.txt 部分由 shell 解释 - 这不会作为参数传递给您的程序。相反,shell 所做的是打开 file.txt 并在测试过程开始时将打开的 file.txt 移交给该过程,以便在您的测试过程中 stdin 连接到 file.txt.

然后,在您的程序中对 gets() 的调用将再次从 stdin 读取,但这次 stdin 不是控制台。这次stdin真的对应了一个文件,也就是file.txt.