2016-09-02 3 views
0

fgetc은 한 번에 파일에서 문자를 읽고 문자를 int 유형으로 반환합니다. 파일이 끝나면 fgetcEOF ("아마도"(int)(-1))을 반환합니다. 그러나, 나는 너무 자주 보았다 :fgetc가 0xFF를 읽으면 어떻게됩니까?

char ch; 

while ((ch = fgetc(fp)) != EOF) { /* Do something. */ } 
     |<-- PARN -->| 

이것은 내가 우려 것입니다 :

  1. fgetcOxFF을 읽고 0x000000FF를 반환합니다.
  2. 0xFFch에 할당됩니다. PARNchar의 유형
  3. 경우 (int에서 char에 캐스팅 유형), 다음은 0xFFFFFFFF으로 승격됩니다.
  4. PARN == EOF이므로 while 루프가 중단됩니다.

우리는 어떻게 OxFF를 읽고 말할 수 떨어져 EOF를 반환 (파일에서 읽기 중지)? 그것이 unsigned char 또는 EOF의 값 중 하나를 리턴 할 수 있기 때문에 fgetc의 리턴 타입 int

+1

이것은'ch'가'char' 대신'int' 타입으로 선언 된 이유입니다. –

+0

그러면 코드가 폭발적입니다. –

+1

대부분 사람들은'ch'를'char'로 선언합니다. –

답변

3

전체의 이유이다. 이것은 명세와 학습 C에 대한 좋은 자료에 명확하게 문서화되어 있습니다. char 유형의 객체를 사용하여 결과를 저장하면 이것은 프로그래머 오류입니다.

+0

알았어요. 다른 코드에서 이런 코드를 보았을 때 (http://stackoverflow.com/questions/30213308/file-pointers-behave-differently-when-passed-to-functions-why), 나는 그것이 틀렸다고 생각했다. 나는 여기서 물어보고 그것이 맞는지 아닌지를 확인한다. 고마워. ;-) –

1

예, 비교가 이루어지기 전에 값이 char로 형식 변환 된 것이 맞습니다.

가장 쉬운 해결책은 다음과 같습니다

int chread; 
while ((chread = fgetc(fp)) != EOF) { char ch = chread; /* Do something. */ } 
+0

솔루션을 제공해 주셔서 감사합니다. ;-) –

0

fgetc()은 성공 또는 실패에 EOF에서 얻어진 문자를 반환합니다.

파일 끝 (end-of-file) 조건으로 인해 실패한 경우, 스트림에 eof 표시기 (feof() 참조)가 추가로 설정됩니다. 오류가 다른 오류로 인해 발생한 경우 스트림에 오류 표시기 (ferror() 참조)를 설정합니다.

관련 문제