[완료]fgetc() 를 사용하여 EOF 읽어 오기

quintus의 이미지

다음 코드에서,

입력이 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; 
} 
bushi의 이미지

ASCII 0x1A 는 제 기억엔... text 파일에서 EOF 를 표시하던 약속이었습니다.
EOF 라기 보다는 이 이후의 내용은 text 가 아니다라는 뜻이었죠.
MS 가 만든 OS 에서만 이 약속을 지켰던 것 같습니다.

stdio.h 에 정의된 EOF 는 위 MS 의 약속과는 아무런 관계도 없습니다.
feof() 함수와 ctrl-d 를 사용하세요.

#include <stdio.h>
int main()
{
    int c;
 
    while ((c = fgetc(stdin)) && !feof(stdin)) {
 
    }
 
    puts("end of file");
 
    return 0;
}
전웅의 이미지

> 다음 코드에서,
> 입력이 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; 
> } 
> 

흠, 만약 콘솔 상에서 키보드를 통해 입력한 내용에서 Ctrl+Z 으로 의도한
EOF 가 입력되지 않는 것이라면 이는 당연한 것입니다. 이곳 게시판이나
구글 등으로 "cooked mode" 나 "canonical mode" 등을 검색해보시기
바랍니다.

Windows 든 Linux 든 cooked mode 의 콘솔에서는 해당 라인의 첫번째
문자로 Ctrl+D, Ctrl+Z 등이 입력된 경우에만 프로그램으로 EOF 를 전달
하게 됩니다.

(cooked mode 에 대한 장문을 글을 예전에 쓴 적이 있는데 도저히 검색이
되지 않는군요. --;;;)

> feof() 함수와 ctrl-d 를 사용하세요.
>

> #include <stdio.h>
> int main()
> {
>     int c;
> 
>     while ((c = fgetc(stdin)) && !feof(stdin)) {
> 
>     }
> 
>     puts("end of file");
> 
>     return 0;
> }

>

<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

IsExist의 이미지

Unix 계열이라면 stty 로 입력을 재 정의해 줄 수 있습니다.

fgetc() 가 ctrl-d, ctrl-z 을 인식하는것이 아니라
입력단에서 이미 끝이 나고 fgetc()는 EOF로 리턴을 하는 겁니다.
---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

---------
간디가 말한 우리를 파괴시키는 7가지 요소

첫째, 노동 없는 부(富)/둘째, 양심 없는 쾌락
셋째, 인격 없는 지! 식/넷째, 윤리 없는 비지니스

이익추구를 위해서라면..

다섯째, 인성(人性)없는 과학
여섯째, 희생 없는 종교/일곱째, 신념 없는 정치

전웅의 이미지

프로그램에서 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

quintus의 이미지

감사합니다.

Windows 든 Linux 든 cooked mode 의 콘솔에서는 해당 라인의 첫번째 문자로 Ctrl+D, Ctrl+Z 등이 입력된 경우에만 프로그램으로 EOF 를 전달 하게 됩니다.

이것이 이유이군요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.