我有这个代码,但它在第5行(fseek)中抛出一个错误。
int cmpFILEd(void *aa,void *bb){
int size1,size2;
FILE *a=(FILE*)aa;
FILE *b=(FILE*)bb;
fseek(a,0,SEEK_END);
fseek(b,0,SEEK_END);
size1=ftell(a);
size2=ftell(b);
if(size1==size2)
return 0;
else if(size1>size2)
return 1;
else
return -1;
}
此代码有什么问题?
_
编辑:错误:
cFILE.exe中0x77052865(ntdll.dll)的第一次机会异常: 0xC0000008:指定了无效句柄。
如果存在此异常的处理程序,则程序可能是安全的 继续进行。
答案 0 :(得分:1)
也许你是要简化代码?
int cmpFILEd(FILE *a, FILE *b)
{
fseek(a, 0, SEEK_END);
fseek(b, 0, SEEK_END);
return ftell(a) > ftell(b) ? 1 : 0;
}
如果函数定义无法更改,可能是:
int cmpFILEd(void *a, void *b)
{
fseek((FILE *)a, 0, SEEK_END);
fseek((FILE *)b, 0, SEEK_END);
return ftell((FILE *)a) > ftell((FILE *)b) ? 1 : 0;
}
较少的学术版本可能有助于诊断问题:
int cmpFILEd(void *a, void *b)
{
long aSize=0;
long bSize=0;
errno=0;
if((-1) == fseek((FILE *)a, 0, SEEK_END))
{
fprintf(stderr, "fseek(a...) failed. errno:%d\n");
goto CLEANUP;
}
errno=0;
if((-1) == fseek((FILE *)b, 0, SEEK_END))
{
fprintf(stderr, "fseek(b...) failed. errno:%d\n");
goto CLEANUP;
}
errno=0;
if((-1) == (aSize=ftell((FILE *)a)))
{
fprintf(stderr, "ftell(a) failed. errno:%d\n");
goto CLEANUP;
}
errno=0;
if((-1) == (bSize=ftell((FILE *)b)))
{
fprintf(stderr, "ftell(b) failed. errno:%d\n");
goto CLEANUP;
}
CLEANUP:
return(aSize > bSize ? 1 : 0);
}
答案 1 :(得分:1)
如果你真的坚持虚空*而不是FILE *,那么如果你发送2 FILE *就会有效。
我运行以下代码:
#include <stdio.h>
int cmpFILEd(void *aa,void *bb){
int size1,size2;
FILE *a=(FILE*)aa;
FILE *b=(FILE*)bb;
fseek(a,0,SEEK_END);
fseek(b,0,SEEK_END);
size1=ftell(a);
size2=ftell(b);
if(size1==size2)
return 0;
else if(size1>size2)
return 1;
else
return -1;
}
int main(){
FILE* f1 = fopen("file1","r");
FILE* f2 = fopen("file2","r");
int x = cmpFILEd(f1,f2);
printf("%d\n", x);
return 0;
}
输入2个文件时,我得到-1,内容分别为“第一个”和“第二个”。
答案 2 :(得分:1)
鉴于:
1)OP&#34; ...无法改变其需要通用的空白。&#34;
2)int cmpFILEd(void *aa,void *bb)
是比较函数
这看起来像qsort()
之类的错误比较函数。
在这种情况下,传递的指针是FILE *
的地址,正如@BLUEPIXY所建议的那样,
int cmpFILEd(void *aa,void *bb){
long size1, size2; // Note use long here
FILE *a = *((FILE**) aa);
FILE *b = *((FILE**) bb);
...