【问题标题】:file pointer and using fgets文件指针和使用 fgets
【发布时间】:2011-03-24 03:45:58
【问题描述】:

gcc 4.4.4 c89

我正在读取一个文件,在该文件中我必须对每一行进行一些操作。

在一个循环中,我调用了 2 个函数,它们传入此文件指针以对文件执行 2 种不同的操作。

但是,当我使用 fgets 读取该文本文件的一行时。它会自动增加到下一行。所以对于第二次调用,它已经增加了。但是,我想在与第一个函数相同的行上执行不同的操作。

FILE *fp = NULL;
fp = fopen("devices.txt", "r");
for each line
    get_devicename(fp); <-- calls fgets and operates on line 1, then increments to line 2

    get_machine_code(fp); <-- calls gets and already on line 2, I need line 1
end for

为了解决问题,我创建了 2 个文件指针对象并将它们传递给函数。但是,将来我可能需要对这个文本文件进行更多操作。因此,如果我必须继续创建文件指针的实例,那么可扩展性就不是很好。

非常感谢您的任何建议,

【问题讨论】:

    标签: c file-io


    【解决方案1】:

    C 文件提供了两个可以为您执行此操作的函数集。使用ftell 获取当前位置,使用fseek 返回该位置。见代码:

    #include <stdio.h>
    
    int main ()
    {
      FILE * pFile;
      int pos;
    
      pFile = fopen("devices.txt", "r");
      pos = ftell (pFile);
      fgets(buf,sizeof(buf),pFile );
      fseek ( pFile , pos , SEEK_SET );
      fgets(buf,sizeof(buf),pFile);
      return 0;
    }
    

    第二个选项是fgetposfsetpos。见代码:

    #include <stdio.h>
    
    int main ()
    {
      FILE * pFile;
      fpos_t position;
    
      pFile = fopen ("myfile.txt","w");
      fgetpos (pFile, &position);
      fputs ("That is a sample",pFile);
      fsetpos (pFile, &position);
      fputs ("This",pFile);
      fclose (pFile);
      return 0;
    }
    

    但我宁愿只读取一次,然后将文件内容传递给两个函数,而不是读取两次。我想不出任何理由两次读取相同的数据。

    【讨论】:

      【解决方案2】:

      首先阅读该行,然后将该行传递给您的 get_XXX 函数:

      FILE *fp = NULL;
      char buf[4096];
      fp = fopen("devices.txt", "r");
      while(fgets(buf,sizeof buf,fp) != NULL) {
          get_devicename(buf);
          get_machine_code(buf);
      }
      

      【讨论】:

        【解决方案3】:

        最好将行作为字符串获取,然后调用函数使用该字符串获取数据,而不是传递文件指针

        【讨论】:

        • 相当。这个困难正暴露出程序设计中的弱点。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多