반응형
fgets 함수는 개행문자가 (\n) 나올 때까지 문자열을 받아준다.
그런데 중요한 것은 예를들어 Hi World 를 입력하고 엔터를 쳤다고 치면
Hi World\0 이아니라
Hi World\n\0 이 받아진다는 것이다. 이것을 잘 알아야 한다.
\n : 개행문자
\0 : 문자열의 긑을 나타냄 (null 문자)
char *fgets(char *str, int num, FILE *stream);
스트림에서 문자열을 받아서 num-1 개의 문자를 입력 받을 때 까지나 개행 문자(\n) 나 파일의 끝(EOF)에 도달할 때 까지
입력 받아 문자열로 저장한다.
NULL문자는 자동으로 문자 뒤에 붙기 때문에 num-1 개의 문자이다.
마지막에 치는 엔터는 \n 의 형태로 문자열에 포함된다 주의!!
예제 ( 내가만든 것임)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <stdio.h> #include <stdlib.h> #include <string.h> #define SIZE 100 int main(void) { FILE *fp=NULL; char a[5]; fp=fopen("4.txt","r"); while(1) { if(feof(fp)!=0) break; fgets(a,sizeof(a),fp); printf("%s\n",a); } return 0; } | cs |
배열 a의 크기가 5이기 때문에 실제로 \0을 제외하면 4개의 문자가 들어갈 수 있다.
아래 텍스트 파일을 실제로 나타내보면
abcdefgh\nidonthave\nhave\nfuckyoumuc 이다.
따라서
abcd\0efgh\0\n\0idon\0thav\0e\n\0have\0\n\0fuck\0youm\0uc\0
가 되고 printf 자체에도 개행문자를 넣어줬기 때문에
다음과 같은 결과가 나오는 것이다.
마지막 줄에 개행문자가 왜 없냐면 파일 포인터가 아랫줄로 내려가지 않았기 때문이다...
반응형