[완료]fgetc() 를 사용하여 EOF 읽어 오기
글쓴이: quintus / 작성시간: 목, 2007/03/01 - 1:01오전
다음 코드에서,
입력이 space, space, Ctrl-Z, space, 순서로 들어 올 때,
저는 fgetc가 Ctrl-Z를 읽고 EOF를 return 하기 기대하는데,
실행 시켜 보면, fgetc()에서 EOF를 return 하지 않고 다음 입력을 받으려고 기다립니다. 왜 그런가요?
feof()를 사용하지 않고 할 수 없나요?
#include <stdio.h> int main(void) { char c; c = fgetc(stdin); while (c == ' ') { c = fgetc(stdin); } if (c == EOF) { puts("end of file"); } return 0; }
Forums:
printf("0x%x\n",
ASCII 0x1A 는 제 기억엔... text 파일에서 EOF 를 표시하던 약속이었습니다.
EOF 라기 보다는 이 이후의 내용은 text 가 아니다라는 뜻이었죠.
MS 가 만든 OS 에서만 이 약속을 지켰던 것 같습니다.
stdio.h 에 정의된 EOF 는 위 MS 의 약속과는 아무런 관계도 없습니다.
feof() 함수와 ctrl-d 를 사용하세요.
> 다음 코드에서, >
> 다음 코드에서,
> 입력이 space, space, Ctrl-Z, space, 순서로 들어 올 때,
> 저는 fgetc가 Ctrl-Z를 읽고 EOF를 return 하기 기대하는데,
> 실행 시켜 보면, fgetc()에서 EOF를 return 하지 않고 다음 입력을 받으려고 기다립니다. 왜 그런가요?
> feof()를 사용하지 않고 할 수 없나요?
>
흠, 만약 콘솔 상에서 키보드를 통해 입력한 내용에서 Ctrl+Z 으로 의도한
EOF 가 입력되지 않는 것이라면 이는 당연한 것입니다. 이곳 게시판이나
구글 등으로 "cooked mode" 나 "canonical mode" 등을 검색해보시기
바랍니다.
Windows 든 Linux 든 cooked mode 의 콘솔에서는 해당 라인의 첫번째
문자로 Ctrl+D, Ctrl+Z 등이 입력된 경우에만 프로그램으로 EOF 를 전달
하게 됩니다.
(cooked mode 에 대한 장문을 글을 예전에 쓴 적이 있는데 도저히 검색이
되지 않는군요. --;;;)
> feof() 함수와 ctrl-d 를 사용하세요.
>
>
<stdio.h> 에 의해 제공되는 표준 입출력 라이브러리는 "sticky" EOF 를
위해 EOF 상태를 스트림 내부 정보에 저장하게 됩니다. feof() 함수는
해당 정보에서 EOF flag (정확히는 end-of-file indicator) 의 설정 상태
만을 반환하도록 구현됩니다 - sticky EOF 이기 때문에 명시적으로 EOF
상태를 clear 해주지 않는 이상 EOF 이후 실제 입력된 내용이 있더라도
EOF 로 유지가 되어야 합니다.
따라서 fgetc() 가 잡지못한 EOF 를 feof() 가 잡는 것은 말이 되지
않습니다 - 실제 그렇다면 이는 비표준 구현입니다.
feof() 는 입력 오류와 EOF 를 구분해주지 않는 입력 함수에서 EOF 를
반환한 이유가 무엇(오류? 진짜 EOF?)인지 구분하는 방법을 제공하는 것
뿐입니다.
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
Unix 계열이라면 stty
Unix 계열이라면 stty 로 입력을 재 정의해 줄 수 있습니다.
fgetc() 가 ctrl-d, ctrl-z 을 인식하는것이 아니라
입력단에서 이미 끝이 나고 fgetc()는 EOF로 리턴을 하는 겁니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
---------
간디가 말한 우리를 파괴시키는 7가지 요소
첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스
이익추구를 위해서라면..
다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치
프로그램에서 raw mode
프로그램에서 raw mode 가 필요한 경우라면, 프로그램 "내에서도" 원하는
바를 얻을 수 있습니다. 물론, 그 순간부터 프로그램의 이식성은 제한됩니다.
제 홈페이지 게시판에 찾으려던 글이 올라가 있었군요 - 지금은 서버가
누워 쉬고 있는 중이라 구글 캐쉬 링크합니다.
http://www.google.com/search?q=cache:k_dF2NIl23EJ:www.woong.org/board/%3Fdoc%3Dbbs/gnuboard.php%26bo_table%3Dhclc%26page%3D1%26wr_id%3D844&hl=ko&ct=clnk&cd=1&gl=kr
--
Jun, Woong (woong at icu.ac.kr)
Web: http://www.woong.org (서버 공사중)
--
Jun, Woong (woong at gmail.com)
http://www.woong.org
감사합니다. Windows
감사합니다.
Windows 든 Linux 든 cooked mode 의 콘솔에서는 해당 라인의 첫번째 문자로 Ctrl+D, Ctrl+Z 등이 입력된 경우에만 프로그램으로 EOF 를 전달 하게 됩니다.
이것이 이유이군요.
댓글 달기