C언어 파일스트림 문자열 구분 관련 질문

include

define CRT_SECURE_NOWARNINGS

int main()

{

int i = 0;
char ch = 0;
char data[100];
FILE *fp1 = fopen("data.txt","wt");
FILE *fp2 = fopen("data.txt","rt");

fputs("#이름: 생활코딩\n",fp1);
fputs("#주민번호: 001234-3123456\n",fp1);
fputs("#전화번호: 010-1111-2222\n",fp1);
fputs("#즐겨먹는 음식: 연어\n",fp1);
fputs("#취미: 컴퓨터 공부\n",fp1);

fclose(fp1);

while(feof(fp2)==0)
{
    fgets(data,sizeof(data),fp2);
    printf("%s",data);
}

fclose(fp2);


return 0;

}

파일스트림을 배우면서 파일에서는 문자열 구분을 개행으로 한다고 학습을 했습니다.

그렇기 때문에 5문장을 쓰면서 문장끝마다 개행을 달아줌으로써 문자열을 구분했습니다.

하지만 이 코드를 실행하게 되면 아래사진과 같이 마지막 문장을 한번 더 반복을 해주는 결과를 출력합니다.

마지막 문장의 개행을 삭제하면 정상적으로 실행이 되지만, 문장의 끝마다 문자열의 구분을 위해서 개행을 기입했는데, 왜 마지막 문장이 한번더 반복이 되는지 궁금합니다.

좋은답변 부탁드립니다. 이미지

1답변

  • 좋아요

    2

    싫어요
    채택취소하기

    fgets는 개행 문자('\n')까지, 혹은 스트림의 끝까지 데이터를 읽습니다.
    만약 마지막 문장이 '\n'으로 끝나면 딱 거기까지만 읽고 끝내기 때문에 스트림에 eof 플래그가 설정되지 않습니다.
    그러면 feofFALSE값을 반환할테고 while문이 종료되지 않을겁니다.
    이어서 가보겠습니다.
    현재 스트림에 남아있는 데이터는 없으니 이어지는 fgets 호출은 eof 플래그가 설정되고 바로 NULL을 반환할겁니다.
    그 다음은 printf죠?
    이 시점에서 data엔 이전 문자열(=마지막 문자열)이 여전히 남아있는 상태일겁니다.
    (eof에 도달하여도 읽은 데이터가 있다면 data는 바뀌지만 이 경우엔 없었으므로 data가 그대로 유지됩니다.)
    이걸 printf로 출력하니 이전 문자열이 한 번 더 출력되게 되는 것입니다.

    • 좋은답변 너무 감사합니다 ^^~ 해커 2019.1.8 21:38

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.