2016-10-21 2 views
2

줄 단위로 파일의 값을 읽고 인쇄하려고합니다. 출력물은 마지막 줄을 두 번 인쇄합니다. 왜 이것이 마지막 줄이되는 것입니까? 파일 끝?C에서 파일 읽기 오류

int main(int argc, char* argv[]) { 

    FILE *file = fopen(argv[1], "r"); 
    if (file == NULL){ 
     printf("error\n"); 
     return 1; 
    } 
    unsigned long long address; 
    int rv = fscanf(file, "%lli", &address); 
    printf("%lli\n", address); 
    do{ 
     rv = fscanf(file, "%lli", &address); 
     printf("%lli\n", address); 
    } while (rv!=EOF); 

    fclose(file); 
    return 0; 
} 
+0

''unsigned long long '값을 읽으려면''% lli "'가 아니라''% llu"'를 사용하십시오. ("% lli"와는 달리, "% lld"도 "% llu"도 16 진수와 8 진수를 지원하지 않으므로 좋은 해결책은 아닌 것 같습니다. –

+0

'if (file == NULL) {perror (argv [1]); return 1;}' –

답변

4

fscanf은 "내부는"실제로 성공하는 경우는 확인하지 않습니다. 파일의 끝 부분에 있다면 아무 것도 읽지 않을 것이고 &address은 업데이트되지 않으며 rv은 읽은 바이트에 대해 0을 얻습니다.

그러면 무조건적으로 address에있는 내용이 인쇄됩니다. 마지막으로 읽은 내용은 마지막으로 읽은 내용이됩니다.

잠시() fscanf이 실패 할 경우

while((rv = fscan(...)) != EOF) { 
    printf(...); 
} 

그 방법은,는 printf와 간단하게 실행되지 않습니다을 사용합니다 DO/동안 사용하지 마십시오.

do/while은 기본적으로 "적어도 한 번 다음을 수행하십시오"인 반면 while은 "다음 번에 0 번 이상 수행"입니다.