2014-06-08 3 views
4

다음 스 니펫에서 fscanf()는 항상 -1 (EOF)이 아닌 0을 반환합니다. 결과적으로 while 루프는 종료되지 않습니다. 왜 그런가?fscanf()가 EOF를 반환하지 않는 이유는 무엇입니까?

void parse_test_file(const char* filename) { 
    double x, y, z; 
    int n_items_read, n_lines_read; 

    FILE* ifd = fopen(filename, "r"); 
    if (NULL == ifd) { 
    fprintf(stderr, "Failed to open %s for reading.\n", filename); 
    return; 
    } 
    n_lines_read = 0; 
    while ((n_items_read = fscanf(ifd, "%la, %la, %la\n", &x, &y, &z)) != EOF) { 
    if (n_items_read != 3) { 
     fprintf(stderr, "n_items_read = %d, skipping line %d\n", n_items_read, n_lines_read); 
    } 
    n_lines_read += 1; 
    } 
    fprintf(stderr, "Read %d lines from %s.\n", n_lines_read, filename); 
    fclose(ifd); 
} 

을 ... 그리고 문제의 파일은 다음과 같습니다

while ((n_items_read = fscanf(ifd, "%la, %la, %la\n", &x, &y, &z)) != EOF) { 
    ... 
} 

전체 코드는 다음과 같다. ((FWIW, 내가 쓰고 더 익숙한 %의 LF 형식을 읽고,하지만 그 차이를하지 않았다 시도했다.)

# this would be the comment line 
0x1.069c00020d38p-17, 0x1.0d63af121ac76p-3, 0x1.82deb36705bd6p-1 
0x1.d5a86153ab50cp-2, 0x1.10c6de0a218dcp-1, 0x1.c06dac8380db6p-3 
0x1.8163b60302c77p-5, 0x1.5b9427fab7285p-1, 0x1.5bccbd0eb7998p-1 

답변

5

문제는 사용자의 입력 파일의 첫 번째 줄입니다. *scanf()을 이해하지 않습니다 쉘 스타일의 의견 그것은 입력 파일의 또 다른 라인입니다 :.. *scanf() 가족 기능의 형식 불일치로 인해 실패 할 때

# this would be the comment line 

은, 파일 포인터가지나 움직이지 않는 더 나은 아이디어는 라인을별로 읽을 것 라인을 찾아 파싱하십시오.

+0

맞습니다. '* scanf()'가 이해하지 못했던 라인을 건너 뛸 것임을 요약합니다 (예 : #로 시작하는 라인). 쉬운 수정 :'(getline (...)! = EOF)'를 사용하여 한 번에 한 줄을 잡고'sscanf()'합니다. 감사. –

관련 문제