如何在Linux上将文件读入C程序?

时间:2015-07-13 04:17:29

标签: c linux

使用a.out file_name_herea.out < file_name_here运行已编译的C程序有什么区别?

我记得有关Linux管道的事情,但我不记得如何使a.out文件使用<符号接受文件。

基本上我要问的是:C代码如何查找C程序:

  1. file_name_here是一个带有&#34; hello world&#34;的文本文件。作为内容
  2. 终端得到&#34; a.out&lt; file_name_here&#34;在命令行
  3. 终端显示输出:&#34; hello world&#34;

3 个答案:

答案 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;其他示例包括catsort

总的解决方案是:

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中的普通用户输入替换为文件内容,因此fgetssscanf等所有普通调用都会对其进行处理。