2012-05-18 1 views
5

c fread() 호출로 간단한 텍스트 파일을 읽으려고 할 때 아주 이상한 오류가 나타납니다.왜 freell() 이후에 ftell()이 잘못된 위치를 표시합니까?

int main(int argc ,char ** argv) { 
    FILE* fh = fopen("adult.txt","r"); 
    if(fh==NULL){ 
    printf("error opening file\n"); 
    exit(0); 
    } 

    int s = 1000; 
    printf("cur before=%d\n",ftell(fh)); 
    char* b = malloc (sizeof(char)*s); 
    int k =fread(b,sizeof(char),s,fh); 
    printf("cur after reading %d bytes =%d\n",k,ftell(fh)); 

    return EXIT_SUCCESS; 
} 

그리고 내가 무엇을 출력으로 얻을 :

cur before=0 
cur after reading 1000 bytes =1007 

정상인가요
은 그 오류를 표시하는 매우 간단한 프로그램을 만들어? fread는 숫자 '1000'을 반환하지만 커서 (ftell() 포함)는 1007을 보여 주므로 도움을 얻을 수 있습니다.

답변

10

그건 정상입니다.

'\n'은 2 자로 표시 될 수 있으므로 기울어 진 부분이 있습니다.

이 문제가 발생하지 않도록하려면 최종적으로 이진 모드로 엽니 다. ftell의 문서에서

+0

감사합니다. 나는 그것을 몰랐습니다. 하지만 왜 fread()의 반환 커서 위치와 동일하지 않습니다? – ezzakrem

+1

@ezzakrem'fread'는 한 줄로 된 두 줄로 된 줄 끝을 하나의 문자로 해석하여 하나로보고합니다. –

4

:

or binary streams, the value returned corresponds to the number of bytes from the beginning of the file. For text streams, the value is not guaranteed to be the exact number of bytes from the beginning of the file, but the value returned can still be used to restore the position indicator to this position using fseek.

그래서 예, 이것은 정상입니다.

+0

덕분에 도움이됩니다! – ezzakrem

1

Let_Me_Be의 답변이 정확합니다. 여기서는 'EOL (End of Line)'문자가 기본 운영 체제에 종속된다는 것을 설명합니다. 예를 들어 Windows에서 'r'(또는 Binary가 아닌) 파일을 열면 '\ r \ n'시퀀스가있을 때마다 OS는 '\ n'만 반환합니다. 같은 방식으로 바이너리 모드로 열리지 않은 파일을 쓸 때 Windows에서는 '\ n'을 쓸 때 '\ r \ n'이라고 쓰게됩니다. 유닉스 시스템에서는 OS에 의한 번역이 없다. 클래식 맥은 줄 끝 문자에 '\ r'을 사용 하겠지만 이제는 EOL에 '\ n'을 사용한다고 생각합니다. '\ n'의 전문 용어를 여러 문자 (\ r \ n)로 (아마도) 표현할 수 있기를 바랍니다.

+0

감사합니다! 그 점이 매우 분명합니다. – ezzakrem

관련 문제