gpt4 book ai didi

c - fseek() - 读取访问冲突

转载 作者:太空宇宙 更新时间:2023-11-04 02:48:36 25 4
gpt4 key购买 nike

我正在编写一个比较文件大小的方法(就像任何比较方法一样)。这是我的方法(我使用 void * 作为参数,因为程序的其他部分需要它):

int compareFileSize(void * p1, void * p2)
{
int result;
FILE * f1, *f2;
f1 = (FILE *)p1;
f2 = (FILE *)p2;
fseek(f1, 0, SEEK_END);
fseek(f2, 0, SEEK_END);
result = ftell(f1) - ftell(f2);
fseek(f1, 0, SEEK_SET);
fseek(f2, 0, SEEK_SET);
return result;
}

当它到达 fseek() 时,它崩溃并在调试器中显示“访问冲突读取”。在我调用该方法之前,这两个文件都已正确打开并且不是 NULL,我知道这一点是因为如果我以相同的方式进行 fseek,就在 fopen 之后,它会起作用。

为什么这不起作用,我该如何解决?

谢谢。

最佳答案

只是猜测:您正在为 qsort(3) 编写一个比较函数,您向其传递一个 FILE* 指针数组:

FILE* arrfil[5] = { NULL };
arrfil[0] = stdout;
arrfil[1] = fopen("foo1","r");
arrfil[2] = fopen("foo2","r");

等等,稍后调用

qsort(arrfil, 5, sizeof(FILE*), compareFileSize);

然后,比较函数的每个 const void* 参数都是指向指针的指针,因此您应该编写代码

int compareFileSize(const void * p1, const void * p2)
{
FILE* f1 = *(FILE**)p1;
FILE* f2 = *(FILE**)p2;
if (f1 == f2) return 0;
if (!f1) return 1;
if (!f2) return -1;
if (fseek(f1, 0, SEEK_END)) return 1;
if (fseek(f2, 0, SEEK_END)) return -1;
result = ftell(f1) - ftell(f2);
fseek(f1, 0, SEEK_SET);
fseek(f2, 0, SEEK_SET);
eturn result;
}

不要忘记用户代码永远不会取消引用 FILE(这是一个不透明的隐藏 struct);换句话说,您总是处理FILE*指针!

顺便说一句,如果您正在为某些 POSIX 系统编码,您可能只使用 fstat(2)

    struct stat st1 ={0}, st2={0};
if (fstat(fileno(f1),&st1) return 1;
if (fstat(fileno(f2),&st2) return -1;
if (st1.st_size == st2.st_size) return 0;
if (st1.st_size < st2.st_size) return -1;
else return 1;

那么您将只使用两个系统调用(而不是四个)。

关于c - fseek() - 读取访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24593813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com