我正在尝试编写一个C函数,它从文件中读取第一行文本,然后使用fseek()
和ftell()
来获取文件其余部分的大小(文件减去第一行)。
我的想法是使用第二个FILE *fp1
来获取原始FILE *fp
的位置,并使用fp1
将fseek()
发送到文件的末尾,以便我不必移动原来的fp
并失去其位置。
这是我的代码。编译器告诉我,我无法将fp1
分配给fp
,因为fp1
是FILE*
而fp
是struct 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);
答案 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;
fp
是FILE *
,但fp1
被定义为FILE
类型。
您不能以这种方式定义FILE
个对象,只能从fopen()
获取它们。它们的状态无法通过制作FILE
对象的副本来保存,对于此而言过于复杂并且使用除FILE
对象之外的其他资源,这可能是不完整的类型。
好消息是,您可以使用fp
将当前偏移量保存在ftell()
中并尝试结束以尝试获取文件大小,然后通过另一次调用{{}来恢复流位置1}}:
fseek()
但你应该注意到这种方法不可靠:
您应该尝试修改您的方法,这样就不需要知道文件大小了。