일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 단편 드라마
- Code Blast
- 2021년 튜링상
- 안드로이드
- Visual Studio Code
- 휴먼명조
- 욱
- 베스트 극장
- 블록 코딩
- 패트릭 브링리
- 인공지능
- 매트로폴리탄 미술관
- 선각자
- 머신러닝
- 중학교 교육과정
- code.org
- 파일 검색
- 누구를 위한 교육과정인가?
- 수학적 귀납법
- 나만의 독서법
- MontyHall
- 알프레드 에이호
- 2022 개정 교육과정
- 코드 폭발 효과
- 변곡점
- 동영상 플레이어
- 박사 논문
- 제프리 울만
- 앱
- 4차 산업혁명
- Today
- Total
코딩하는 공무원
문자열 입력 함수 fscanf(), fgets() 본문
fscanf()와 fgets()는 문자열 입력 함수입니다.
파일 포인터에 따라서 표준 입력도 가능하고, 파일 입력도 가능하지요...
그러나, 이 둘에는 미묘한 차이가 있습니다.
파일 입력을 예로 들어보지요...
input.txt 파일 안에 다음과 같은 내용이 있다고 가정합니다.
Computer science education
Some universities teach
computer science as a theoretical study of computation
and algorithmic reasoning
이때 다음과 같은 코드를 실행하면 주석처럼 입력됩니다.
char str[4][100];
fscanf(fp,"%s",str[0]); // Compter
fscanf(fp,"%s",str[1]); // science
fscanf(fp,"%s",str[2]); // education
fscanf(fp,"%s",str[3]); // Some
다음과 같은 코드를 실행하면 주석처럼 입력됩니다.
fgets(str[0],100,fp); // Computer science education
fgets(str[1],100,fp); // Some universities teach
fgets(str[2],100,fp); // computer science as a theoretical study of computation
fgets(str[3],100,fp); // and algorithmic reasoning
input.txt 파일 안에 다음과 같은 내용이 있다고 가정합니다.
abcdefgh
ijklmnopq
EOF
이때, 다음 두 줄의 코드라인으로 파일을 읽어올 때 어떤 문제가 발생할까요? str[0]의 배열 내부를 보면 그 차이점을 알 수 있는데요...
fscanf(fp,"%s",str[0]); // 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' '\0'
fgets(str[0],100,fp); // '\n' '\0'
fscanf() 함수의 경우, 파일 포인터는 그 줄의 맨 마지막 '\n'을 가리키게 됩니다. 바로 다음 줄에서 fscanf() 함수로 읽으면, 자동으로 다음 줄을 읽게 되지만, fgets() 함수로 읽기 위해서는 바로 직전에, fgetc(fp);를 한번 실행해서 파일 포인터를 그 다음 줄로 옮겨 놓아야 합니다. 그렇게 하지 않으면, 다음 줄에서 fgets()로 읽게 되는 문자열은 '\n' '\0' 이 됩니다. fscanf() 함수에서 '\n'을 읽지 않은 이유는 %s의 경우, 공백, 개행 문자, 탭 등을 문자열의 구분자로 인식하기 때문이지요...
fscanf() 함수를 연속으로 두 번쓰면, 두번째 fscanf() 함수는 첫번째 fscanf()가 남겨놓은 '\n'을 건너뛴 후 읽기 때문에 정상적으로 문자열을 읽어오지만, fscanf() 함수로 읽은 후에, 바로 그 다음 줄에서 fgets() 함수를 사용하게 되면, fscanf() 함수가 읽지 않고 남겨 놓은 '\n'을 fgets() 함수가 읽어 버리기 때문입니다.
input.txt 파일을 fgets()로만 읽어보면 이렇게 되겠지요..
fgets(str[0],100,fp); // 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' '\n' '\0'
fgets(str[1],100,fp); // 'i' 'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' '\n' '\0'
따라서, 곧바로 다음과 같은 코드로 문자열을 출력하면, \n이 없이도 한 라인씩 출력되는 것이지요...
printf(“%s%s”,str[0],str[1]);
'프로그래밍' 카테고리의 다른 글
Code::Blocks 설치하기 (0) | 2010.05.07 |
---|---|
scanf(), getchar() 함수로 문자 하나를 읽어 올 때 주의할 점 (2) | 2010.05.04 |
wxDev-C++ 공개 컴파일러 (0) | 2010.03.31 |
EditPlus를 능가하는 AcroEdit (0) | 2009.12.04 |
Java를 EditPlus에서 실행하는 방법 (0) | 2009.11.26 |