기억하십시오 : fgetc()
은 char
이 아니라 int
을 반송합니다. int
을 반환해야합니다. 반환 값 집합에는 가능한 모든 유효한 문자와 별도의 (음수) EOF 표시기가 포함되어 있기 때문입니다. 유형 char
이 컴파일러로 서명
경우, EOF로 유효한 문자를 감지 : 당신이 c
대신 int
의 대한 유형 char
를 사용하는 경우
는 두 가지 함정이있다. 종종, 문자 ÿ (y- 움라우트, 공식적으로는 라틴어로 LASE CASE Y WITH DIAERESIS, U + 00FF, ISO 8859-1 라틴어 1 코드 집합의 16 진수 코드 0xFF)는 EOF와 동등한 것으로 탐지됩니다. 그것은 유효한 문자입니다.
유형 char
이 서명되지 않은 경우 비교는 사실이 아닙니다.
모두 문제가 심각하고, 모두가 올바른 형식을 사용하여 피할 수있다 : 유형이 FILE
하지 File
입니다
FILE *fp = fopen("file.txt", "r");
if (fp != 0)
{
int c;
int nl = 0;
while ((c = fgetc(fp)) != EOF)
if (c == '\n')
nl++;
printf("Number of lines: %d\n", nl);
}
하는 것으로. fp
을 통해 읽기 전에 파일이 열려 있는지 확인해야합니다. 내가 char c
를 사용할 때
내가 명시 적으로 CTRL + D를주는 경우에
는 EOF도 감지된다.
이것은 컴파일러가 char
을 서명 된 유형으로 제공함을 의미합니다. 또한 ÿ가 포함 된 파일에서 라인 수를 정확하게 계산할 수 없다는 것을 의미합니다.
CP/M 및 DOS와 달리 Unix는 EOF를 나타내는 문자를 사용하지 않습니다. 읽을 문자가 더 이상 없을 때 EOF에 도달합니다. 많은 사람들을 혼란스럽게하는 이유는 단말기에 특정 키 조합을 입력하면 프로그램이 EOF를 감지한다는 것입니다. 실제로 일어나는 일은 터미널 드라이버가 문자를 인식하고 읽지 않은 문자를 프로그램에 보냅니다. 읽지 않은 문자가 없으면 프로그램은 0 바이트를 반환하며 이는 파일 끝에 도달했을 때와 동일한 결과입니다. 따라서 문자 조합 (종종은 아니지만 항상 Ctrl-D)이 프로그램에 'EOF 보내기'를 표시합니다. 그러나 문자가 cat >file
을 사용하는 경우 파일에 저장되지 않습니다. 또한 control-D가 들어있는 파일을 읽으면 바이트 값이 0x04 인 완벽한 문자입니다. 프로그램이 control-D를 생성하여 프로그램에 보내는 경우 프로그램에 EOF가 표시되지 않습니다. 이것은 유닉스 터미널 (tty 및 pty-teletype 및 pseudo-teletype - 장치)의 속성입니다.
가능한 [fgetc은 EOF를 식별하지 못합니다] (http://stackoverflow.com/questions/3977223/fgetc-does-not-identify-eof), http://stackoverflow.com/questions/11057259도 참조하십시오./fgetc-checking-eof 및 많은 다른 많은 파일들 – Mat
참고 : EOF는 "파일에 저장"되어 있지 않으며 입출력 기능이 파일 끝에 도달했음을 알려주는 유일한 방법입니다. 끝에는 매직 바이트가 저장되지 않습니다. – Mat
'File * fp;가 아닌'FILE * fp;가되어야하며, 변수'fp'를 통해 무엇인가를 읽기 전에 파일이 성공적으로 열렸는 지 확인해야합니다. –