2012-03-11 2 views
0

다음과 같은 테이블이 있습니다.C에서 fscanf 오류를 확인하는 방법

01 01 02 00 01 02 00 01 
01 02 00 01 02 00 01 02 
02 00 11 04 04 04 04 04 
00 01 10 03 03 03 03 03 
이 같은이 파일을 읽고있다

:

FILE *map = open_file("lazy.map"); 
if (map == 0) 
    return 0; 

for (i = 0; i < TOTAL_TILES; ++i) { 
    int ttype; 
    fscanf(map,"%i",&ttype); 
    // do other stuff here... 
} 

fscanf 실패인지 아닌지 나는 확인할 수있는 방법이 있나요를?

답변

2

반환 값을 확인하십시오. fscanf에 의해 소비되고 얼마나 많은 기호를 확인할 수 있습니다

int n = -1; 
int ttype; 
fscanf(map, "%i%n", &ttype, &n); 
if(-1 == n) 
    // failed to parse 

이 방법 :

또 다른 옵션은 %n 형식을 사용하는 것입니다. 그것은 위의 차이가 있지만에서하지 않습니다

int count = fscanf(map, "%i abc %n", &ttype, &n); 

count이 형식의 abc 일부가 일치하지 않은 경우에도 1보다 큰 수 있습니다. 반면에 전체 형식이 일치하는 경우에만 n이 설정됩니다.

0

예. C++ reference에서 :

반환 값 성공시

, 함수는 성공적으로 읽 항목 의 수를 반환합니다. 이 수는 판독 값의 예상 수와 일치하거나 일치하지 않는 경우 0이됩니다. 데이터가 성공적으로 입력되기 전에 입력 오류가 발생한 경우 을 읽고 EOF를 반환합니다.

1

예 : 반환 값을 확인할 수 있습니다. Per http://pubs.opengroup.org/onlinepubs/007904975/functions/scanf.html :

성공적으로 완료되면이 함수는 성공적으로 일치하고 할당 된 입력 항목 수를 반환합니다. 이 번호는 초기 일치 실패시 0이 될 수 있습니다. 첫 번째 일치 실패 또는 변환 전에 입력이 끝나면 EOF가 반환됩니다. 읽기 오류가 발생하면 스트림에 대한 오류 표시기가 설정되고 EOF가 리턴되며 오류 번호이 오류를 나타내도록 설정됩니다. C 표준 자체가 errno를이 설정 될 필요가 없습니다 것을 의미 POSIX 고유의 것으로,

는 (그 페이지는 마지막 부분 것을 표시 "를 errno를는 에러를 가리 키도록 설정해야한다" 나머지는 모두 C 표준에서 요구됩니다.)