C언어 파일스트림 문자열 구분 관련 질문
조회수 638회
include
define _CRT_SECURE_NO_WARNINGS
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 답변
-
fgets
는 개행 문자('\n')까지, 혹은 스트림의 끝까지 데이터를 읽습니다.
만약 마지막 문장이 '\n'으로 끝나면 딱 거기까지만 읽고 끝내기 때문에 스트림에 eof 플래그가 설정되지 않습니다.
그러면feof
가FALSE
값을 반환할테고 while문이 종료되지 않을겁니다.
이어서 가보겠습니다.
현재 스트림에 남아있는 데이터는 없으니 이어지는fgets
호출은 eof 플래그가 설정되고 바로NULL
을 반환할겁니다.
그 다음은printf
죠?
이 시점에서 data엔 이전 문자열(=마지막 문자열)이 여전히 남아있는 상태일겁니다.
(eof에 도달하여도 읽은 데이터가 있다면 data는 바뀌지만 이 경우엔 없었으므로 data가 그대로 유지됩니다.)
이걸printf
로 출력하니 이전 문자열이 한 번 더 출력되게 되는 것입니다.-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력