在fseek()之前保持FILE指针的位置

时间:2016-01-23 21:29:50

标签: c file-io fseek

我正在尝试编写一个C函数,它从文件中读取第一行文本,然后使用fseek()ftell()来获取文件其余部分的大小(文件减去第一行)。

我的想法是使用第二个FILE *fp1来获取原始FILE *fp的位置,并使用fp1fseek()发送到文件的末尾,以便我不必移动原来的fp并失去其位置。

这是我的代码。编译器告诉我,我无法将fp1分配给fp,因为fp1FILE*fpstruct FILE*

我可以实现我尝试这样做的方式吗?

 FILE *fp, fp1;
 fp = fopen(filename, "r");
 if (!fp)
     return 0;

 fscanf(fp, "%1d", m); //Lines 15-18 read the first line of the file
 fscanf(fp, "%*1c");
 fscanf(fp, "%1d", n);
 fscanf(fp, "%*1c");
 fp1 = fp;         //<---------- This is my problem.
                   //how do I set fp1 to the same place in the
                   //file as fp?

 fseek(fp1, 0, SEEK_END);
 *file_size = ftell(fp1);

2 个答案:

答案 0 :(得分:3)

这只是将指针复制到文件句柄。正确的方法是在移动之前保存ftell结果,并在移动到文件末尾后再移回。

所以:

long saved = ftell(fp);
fseek(fp, 0, SEEK_END);
*file_size = ftell(fp);
fseek(fp, saved, SEEK_SET);

答案 1 :(得分:1)

您的定义未定义2个FILE *指针:

FILE *fp, fp1;

fpFILE *,但fp1被定义为FILE类型。

您不能以这种方式定义FILE个对象,只能从fopen()获取它们。它们的状态无法通过制作FILE对象的副本来保存,对于此而言过于复杂并且使用除FILE对象之外的其他资源,这可能是不完整的类型。

好消息是,您可以使用fp将当前偏移量保存在ftell()中并尝试结束以尝试获取文件大小,然后通过另一次调用{{}来恢复流位置1}}:

fseek()

但你应该注意到这种方法不可靠:

  • 不保证文本文件。
  • 它可能不适用于设备,管道,终端,特殊文件......

您应该尝试修改您的方法,这样就不需要知道文件大小了。