티스토리 뷰

전체/장난하기

fgetc 함수

Coolen 2005. 3. 7. 22:01
[CODE]char ch; while( (ch = fgetc( f )) != EOF ) { printf("%c", ch ); }[/CODE]

언뜻보기에는 맞는 것 같이 보인다. 하지만, 여기에는 isprint 못지 않은 두려운 버그가 숨어 있다.

fgetc 의 원형은 다음과 같다.

[CODE]int fgetc( FILE * );[/CODE]

fgetc의 return 값이 int 란다. 그리고, 문자하나를 되돌리는 함수라니..

각설하고 위 코드는 다음과 같아야한다.

[CODE]int ch; while( (ch = fgetc( f )) != EOF ) { printf("%c", (char) ch ); }[/CODE]

fgetc의 설명을 보면, 파일의 끝이나 오류를 만났을 때 EOF를 되돌린단다. unsigned char 로 표현할 수 있는 문자의 범위를 벗어나는 값으로 EOF가 정의되어 있지 않는한 파일에서 EOF와 동일한 문자값을 읽었을 때 이것이 파일의 끝이 아님에도 불구하고 끝으로 해석하는 버그가 좋아하는 상황이 벌어지게 될 것이다.

처음 코드에서는 강제로 char 변수에 받았으니, 문자 중에 어떤 값은 EOF로 해석되는 경우도 생기는 것은 당연하고, 따라서, fgetc의 리턴값은 파일에서 한 문자를 읽는것에만 흥분한 나머지, 오류 리턴을 제대로 판단하지 못하게 되는 것이다.
따라서, EOF인지 확인한다음 char로 캐스팅하여야 정상적인 사용법이 되는 것이다.

실제 EOF는 많은 구현에서 -1 로 정의되어 있다.
반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함