文件指针和使用fgets

3

gcc 4.4.4 c89

我正在读取一个文件,并需要对每一行执行一些操作。

在循环中,我调用了两个函数,将该文件指针传递给它们,在文件上执行两个不同的操作。

然而,由于我使用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

为了解决这个问题,我创建了两个文件指针对象并将它们传递给函数。然而,未来我可能需要对这个文本文件进行更多的操作。如果我不得不一直创建文件指针的实例,那么这种方法就不太可扩展。
非常感谢您的建议,
3个回答

8

首先读取该行,然后将该行传递给您的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);
}

2

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
最好将该行作为字符串获取,然后使用该字符串调用函数获取数据,而不是在文件指针之间传递。

相当。这个困难显示了程序设计中的弱点。 - Brian Hooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接