이번에는 지난번에 공부한 '텍스트 파일 읽고 쓰기'를 바탕으로 시험에 출제되었던 문제를 풀어봤다.
문제는 줄마다 번호를 매기고 그 줄에 해당하는 문자열을 출력하는 것이다.
우선 좋아하는 노래 가사를 넣어 linefile.txt를 작성했다.
위에 문자열들이 '#1: When I was six years old I broke my leg' 이런식으로 출력되게 하기 위해서 코드를 작성했다.
#include<stdio.h>
#define LENGTH 100
int main(void)
{
int line = 0;
char str[LENGTH];
FILE* fp = NULL;
fp = fopen("linefile.txt", "r");
while (fgets(str, LENGTH, fp) != NULL) {
line++;
printf("#%d: %s\n", line, str);
if (line == NULL)
break;
}
fclose(fp);
return 0;
}
결과는 원하는대로 아래와 같이 나왔다.
이번에 공부를 하고 다시 이 문제를 풀면서 알게 된 점은 fgets()의 인수를 제대로 이해하지 못하고 있었다는 점인데 이전에는 fgets(fp)로 파일 포인터를 의미하는 fp를 인수로 두고 코드를 작성했었다. 책에 그렇게 나왔었는데 다시 실행시키면서 공부하니까 인수가 조금 달랐다.
fgets()함수를 정리해보면
1. fgets() 함수의 원형은
char *fgets(char * restrict s, int n, FILE * restrict stream)
2. 인수의 내용은
첫 번째, 읽은 문자열이 저장될 주소
두 번째, 읽을 문자의 최대 개수 (이보다 하나 적은 수의 문자를 읽거나, 파일의 끝에 도달할 때까지 문자를 읽음)
세 번째, 스트림을 결정할 FILE 구조체 변수의 포인터
3. 이 함수는 읽기에 성공하면 읽은 문자열이 저장된 주소를 반환, 파일의 끝에 도달하거나 읽기에 실패하면 NULL을 반환
4. fgets() 함수는 문자를 읽어 들이는 도중에 개행 문자('\n')를 만나게 되면 곧바로 읽기를 종료(이거는 사실 잘 모르겠음.. 개행 문자 넣어도 읽기가 계속 되던데 연속 두번은 돼야하는 건지...)
5. 지금까지 읽어 들인 문자들이 C언어에서 문자열로 인식되도록 맨 마지막에 널 문자('\0')를 자동으로 추가해 줌
그리고 약간 궁금했던게 있었는데 13번째 줄이 비어있어서 12번째 줄까지 출력되고 끝날까 했는데 14번째 줄부터 마지막 줄까지도 계속 출력이 되어서 신기했다. NULL값이 나올 때까지 문자열을 반복해서 출력하는 거니까 13번째 줄은 0으로 처리되지 않았나 싶다.
'프로그래밍 언어 > c' 카테고리의 다른 글
구조체와 공용체 (0) | 2021.01.10 |
---|---|
포인터와 함수 그리고 void형 포인터 (2) | 2021.01.07 |
c언어 (1) - 포인터 (0) | 2021.01.05 |
C언어 파일 입출력 (1) (0) | 2021.01.03 |
[오류] C언어의 Segmentation fault 오류에 대해서 알아보자 (0) | 2020.12.31 |