c언어 파일입출력 질문드립니다.

sks93의 이미지

c언어에서 파일입출력을 할때
feof이나 eof로
파일의 끝을 확인하는걸로 알고있습니다.

그런데 만약 파일이 바로 지금 읽어들일 내용이 EOF일 때 0이 아닌 값을 리턴하고
이미 EOF에 도달했거나 넘어섰다면 0을 리턴한다고 알고있습니다.

시작할때 먼저파일을 읽고 그 파일에 제가 찾고자하는 값이 없을경우 파일에 데이터를 넣고 다시 파일을 읽는형식으로 하려합니다.

이때 만약 파일이 비어있는경우 eof를 어떻게 해야하나요?

eof이 파일이 비어있을때도 0을 리턴하기에 좀 애를먹고있네요

bushi의 이미지

feof() 는 그런 함수가 아닙니다. 매뉴얼 읽기 귀찮으면 검색이라도 해보세요.

ozon1000의 이미지

#include <stdio.h>
 
int main(void){
     int state;
     char a;
 
     //데이터를 읽기위한 스트림 생성
     FILE* fp = fopen("D:\\mystory.txt", "rt");
     /* fopen함수는 오류발생시 NULL을 리턴하므로
     파일 개방 중 오류발생시 프로그램을 종료 */
     if (fp == NULL){
          printf("스트림 생성시 오류발생");
          return 1;
     }
 
     /* 파일에 얼마의 데이터가 있는지 모른다고 가정
     무한루프를 돌면서 계속 데이터를 출력
     파일에 끝에 도달하면 feof함수에 의해 반복문 탈출 */
     while (1){
          if (feof(fp) != 0){
               printf("파일의 끝에 도달했습니다.\n");
               break;
          }
 
          //한글자씩 꺼내서 출력
          a = fgetc(fp);
          printf("%c", a);
     }
 
     /* fclose함수는 종료시 오류가 발생하면
     0이 아닌 다른값을 리턴하므로 비정상 종료로 판단되면
     안내후 프로그램을 종료 */
     state = fclose(fp);
     if (state != 0){
          printf("스트림 제거시 오류발생");
          return 1;
     }
     return 0;
}
Anti-Lock의 이미지

코드만 올리시고 별다른 언급이 없어서 추측하건데,
위의 코드는 '잘못된 활용의 예'일거라고 믿습니다.

마지막으로 실행되는
a = fgetc(fp);
는 a 에 -1 을 집어넣습니다. (EOF 값이 -1 입니다)
따라서 변수 a의 타입은 char 가 아니라 int 가 되어야 합니다.
fgetc 의 함수원형은 다음과 같구요.
int fgetc ( FILE * stream );

그리고 예로 드신 코드에서 fgetc 가 EOF 를 반환하기 이전이라면
feof함수는 별다른 도움이 안됩니다.

ozon1000의 이미지

진짜 잘 이해가 안되서 너무 궁금하네요..
fgetc의 EOF 값이 -1 이기때문에 a의 타입이 char가 아니라 int가 되어야 하는 이유는 무엇인가요?

Anti-Lock의 이미지

조금은 이상하게 적어 놔서 죄송합니다.
char 가 아니라 int 가 되어야 하는 이유는...
1. fgetc 는 int 타입을 반환합니다.
int fgetc ( FILE * stream );
2. fgetc 반환값을 char 로 받을 경우,
스트림에서 읽어들인 데이터 0xff 와 EOF(=-1) 를 서로 구별할 수 없습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.