【问题标题】:Linux Redirection to C program - File ReadingLinux 重定向到 C 程序 - 文件读取
【发布时间】:2015-03-21 08:44:09
【问题描述】:

我想使用 C 中的函数从文本文件 (filename.txt) 中读取数字行。

我如何打开这个文件(如果文件名仅在 Unix 上通过重定向给出)?

i.e. ./cfile < filename.txt

int main (void)
{
  char filename[20];
  fgets(filename, 19, stdin);
  FILE *fp;
  fp = fopen(filename, "r");
}

那么,这是正确的吗?另外,如何从文件中一次访问一行(我所知道的是必须在某处使用 EOF)?

【问题讨论】:

    标签: c linux stdin eof fgets


    【解决方案1】:

    < 用于从文件而不是键盘重定向标准输入,在这种情况下您不需要fopen

    int main(void)
    {
        char buffer[100];
    
        /* Don't use magic numbers with fgets, sizeof buffer is the correct size */
        while (fgets(buffer, sizeof buffer, stdin)) {
            printf("%s", buffer);
        } 
        return 0;
    }
    

    您可以使用传递给 main 的参数 fopen 文件:

    int main(int argc, char *argv[])
    {
        char buffer[100];
        FILE *fp;
    
        if (argc == 2) {
            fp = fopen(argv[1], "r");
            if (fp == NULL) {
                perror("fopen");
                exit(EXIT_FAILURE);
            }
            while (fgets(buffer, sizeof buffer, fp)) {
                printf("%s", buffer);
            } 
            fclose(fp);
        }
        return 0;
    }
    

    使用./cfile filename.txt 启动它(没有重定向)。

    【讨论】:

      【解决方案2】:

      filename.txt内容 被重定向到可执行文件的标准输入。因此,您可以简单地编写如下代码:

      #include <stdio.h>
      
      #define MAXLEN 256 // Maximum number of characters in a line
      
      int main() {
         char line[MAXLEN];
         while (fgets(line, MAXLEN, stdin)) {
             printf("Line %s", line); // Do something with the line
         }
         return 0;
      }
      

      【讨论】:

        【解决方案3】:

        在 Linux 上,当您运行程序时,会打开 3 个文件,分别是标准输入 (fd 0)、输出 (fd 1) 和错误 (fd 2)。默认情况下,这些文件是您的终端:

         % cat & 
         % ls -l /proc/`pidof cat`/fd
        total 0
        lrwx------ 1 max max 64 mars  21 10:34 0 -> /dev/pts/0
        lrwx------ 1 max max 64 mars  21 10:34 1 -> /dev/pts/0
        lrwx------ 1 max max 64 mars  21 10:34 2 -> /dev/pts/0
        

        但您也可以指定应该与 和 2> 一起使用的文件:

         % cat > /dev/null &        
         % ls -l /proc/`pidof cat`/fd
        total 0
        lrwx------ 1 max max 64 mars  21 10:36 0 -> /dev/pts/0
        l-wx------ 1 max max 64 mars  21 10:36 1 -> /dev/null
        lrwx------ 1 max max 64 mars  21 10:36 2 -> /dev/pts/0
        

        所以,文件已经打开,分别位于FILE* stdinstdoutstderr。对于最后一个示例,它位于标准输出中,但在您的情况下(使用 FILE* stdin 中。

        所以基本上你不需要fopen,你可以使用stdin

        【讨论】:

          猜你喜欢
          • 2011-04-17
          • 2012-10-25
          • 2020-05-04
          • 2021-03-10
          • 1970-01-01
          • 2010-11-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多