티스토리 뷰
[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 로 정의되어 있다.
언뜻보기에는 맞는 것 같이 보인다. 하지만, 여기에는 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
링크
TAG
- SSO
- nodejs
- Tattertools plugin
- JavaScript
- SVN
- 식물
- OpenID
- url
- BlogAPI
- 오픈소스
- 수선화
- Subversion
- 킹벤자민
- 클레로덴드럼
- VIM
- 구근
- MySQL
- macosx
- 벤자민
- 퀴즈
- 디버깅
- writely
- Linux
- perl
- 커피
- 대화
- 덴드롱
- ssh
- tattertools
- TCP/IP
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함