使用a.out file_name_here
和a.out < file_name_here
运行已编译的C程序有什么区别?
我记得有关Linux管道的事情,但我不记得如何使a.out
文件使用<
符号接受文件。
基本上我要问的是:C代码如何查找C程序:
答案 0 :(得分:4)
a.out file_name_here
传递&#34; file_name_here&#34;作为一个论点。
a.out < file_name_here
由shell处理,并显示&#34; file_name_here&#34;的内容。在#st;&#34; stdin&#34;。
答案 1 :(得分:1)
请注意,当您键入a.out < filename
时,shell会处理I / O重定向。程序运行时其标准输入来自指定文件而不是来自终端。当您键入a.out filename
时,程序必须处理打开文件,读取它(最好也关闭它)。这些示例都没有使用管道。您可以编写cat file1 file2 file3 | a.out
来使用管道,并提供三个文件的内容作为程序的标准输入。
Unix系统上的许多程序都是过滤器。如果给它们处理文件名,则读取它们。如果它们没有文件名,那么它们会读取标准输入。这种程序的一个例子是grep
;其他示例包括cat
和sort
。
总的解决方案是:
extern void process_file(FILE *fp); // Where the real work is done
int main(int argc, char **argv)
{
int rc = EXIT_SUCCESS;
if (argc == 1)
process_file(stdin);
else
{
for (int i = 1; i < argc; i++)
{
FILE *fp = fopen(argv[i], "r");
if (fp == 0)
{
fprintf(stderr, "%s: failed to open file %s for reading\n",
argv[0], argv[i]);
rc = EXIT_FAILURE;
}
else
{
process_file(fp);
fclose(fp);
}
}
}
return rc;
}
这会将任何命令行参数作为要读取的文件处理,如果在命令行中未指定文件,则需要读取标准输入。您可以对此大纲进行大量额外调整。您可以使用getopt()
轻松添加选项处理(如果您使用的是GNU,则可以getopt_long()
),如果您愿意,可以将文件名-
视为标准输入。如果您认为合适,则可以在未能打开文件时退出(有时它是;有时它不是 - grep
不是,例如)。您可以将文件名传递给process_file()
函数。您可以使process_file()
函数报告成功失败,并跟踪是否一切正常,只有在所有操作都成功时才退出零。
答案 2 :(得分:0)
刚刚意识到我遇到的问题。 <
符号表示shell将C中的普通用户输入替换为文件内容,因此fgets
和sscanf
等所有普通调用都会对其进行处理。