当用户在 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
指针存储在名为 stdin
、stdout
和 stderr
.
的变量中
其中,stdin
可用于读取,stdout
和stderr
可写入。并且,stdin
在多个 C 库调用中用作默认值,例如 gets
或 scanf
。同样,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.
我正在尝试制作一个可以在 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
指针存储在名为 stdin
、stdout
和 stderr
.
其中,stdin
可用于读取,stdout
和stderr
可写入。并且,stdin
在多个 C 库调用中用作默认值,例如 gets
或 scanf
。同样,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.