2014-07-05 5 views
1

이 코드가 있지만 5 행 (fseek)에 오류가 있습니다.C로 된 2 개의 파일을 크기로 비교하십시오.

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; 
} 

이 코드의 문제점은 무엇입니까?

_

편집 : 오류 : 코드를 단순화했다 아마도 경우

First-chance exception at 0x77052865 (ntdll.dll) in cFILE.exe: 0xC0000008: An invalid handle was specified.

If there is a handler for this exception, the program may be safely continued.

+0

무엇인가하는 것은 당신이 얻을 오류가, 있습니다 통과? – Mickey

+0

'FILE *'보다는'FILE **' – BLUEPIXY

+0

하지만 ** 대신 *로하면 ftell을 사용할 수 없다고 생각합니다. fseek – Mickey

답변

1

주어진 점 :
1) OP "... 캔트가 일반화해야 할 필요가없는 공백을 변경했습니다."
2) int cmpFILEd(void *aa,void *bb)는 이것은 qsort() 또는 질병에 대한 올바른 형식 비교 기능과 같은 기능을

과 비교된다. @BLUEPIXY에 의해 제안

이 경우

, 포인터는 주소 FILE *

int cmpFILEd(void *aa,void *bb){ 
    long size1, size2; // Note use long here 
    FILE *a = *((FILE**) aa); 
    FILE *b = *((FILE**) bb); 
    ... 
1

?

int cmpFILEd(FILE *a, FILE *b) 
    { 
    fseek(a, 0, SEEK_END); 
    fseek(b, 0, SEEK_END); 

    return ftell(a) > ftell(b) ? 1 : 0; 
    } 

함수 정의는 아마도, 변경할 수없는 경우 : FILE * 당신이 정말로 무효를 주장하는 경우

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

하지 :

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; 
    } 

덜 학술 버전은 문제를 진단하는 데 도움이 될 *, 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; 
} 

-1 "두 번째"각각 :

는 다음 코드를 실행합니다.

관련 문제