[C] 파일 입출력 3 (fgets)

만약에 문자열을 읽어오고 싶다면?

fgets 함수


fgets(문자 변수, 읽을 글자수 + 1, 읽어올 파일의 포인터 변수);

// 작성 예시
fgets(str, 254, fp);

\n까지 fp에 저장한다. 파이썬의 readline()과 역할이 같다.

여기서 읽을 글자수 + 1을 입력하는 이유는 저장을 할 때 널문자(\0)까지 저장할 공간이 있어야 하기 때문이다.

따라서, fgets(str, 5, fp);를 입력한다면 파일로부터 읽어오는 글자 수는 4글자 이다.

또한, 엔터(\n)를 만나면 엔터까지 배열에 저장한 뒤 읽기를 중단한다.

fgets로 파일 전체를 읽기


파일 전체를 읽으려면 파일 끝에 도달했다는 것을 어떻게 판정할 것인지 알아야한다.

    while (fgets(str, 255, fp) != NULL) {
        printf("%s", str);
    }

한 글자씩 읽는 것과는 달리, 문자열로 읽은 경우는 주소를 return하므로 EOF가아니라 NULL로 처리를 하게 된다.

따라서 이 때에는 위에 적은 코드처럼 != NULL 코드로 판정을 해줄 수 있다.

다시 정리해보면,

  • 문자 함수 fgetc, fputc : EOF로 파일 끝을 처리.
  • 문자열 함수 fgets, fputs : NULL로 파일 끝을 처리.


fputs함수

#include <stdio.h>
#include <stdlib.h>

#pragma warning (disable : 4996)

int main() {
    FILE *fp, *fp2;
    char str[255];

    fp = fopen("meaning.txt", "r");
    fp2 = fopen("m2.txt", "w");

    if (fp == NULL || fp2 == NULL) {
        printf("실패\n");
        exit(1);
    }


    // while (fgets(str, 255, stdin) != NULL) : 표준 입력장치(키보드)
    while (fgets(str, 255, fp) != NULL) {
        // fputs(str, stdout); 표준 출력장치 (모니터)
        fputs(str, fp2); 
    }

    printf("저장이 완료되었습니다.\n");

    fclose(fp);
    fclose(fp2);
    return 0;
}

문자하나에 대해서는 fputc를 사용했다면, 문자열에 대해서는 fputs함수를 사용할 수 있다.

위의 코드는 fputs함수를 사용해서 파일을 복사하는 코드이다.

fputs(문자열변수, 포인터변수);

위와 같은 형태로 사용할 수 있다.

C언어에서 0을 처리하는 방법


  1. 0 : 정수나 실수를 처리할 때 사용
    (int a = 0;)
  2. ‘\0’ : 문자열의 끝을 의미할 때 사용
    (char c = ‘\0’)
  3. NULL : 포인터가 가리키는 값이 없을 경우 사용
    (int* p = NULL;)

위 세가지 모두 C언어에서는 같은 의미로 받아들이지만, 프로그래밍에서 사용할 때에 따라서 다르게 사용된다.

즉, 위의 예시 코드에서 0, ‘\0\, NULL 중 아무거나 써도 오류가 발생하지는 않는다.

하지만 가독성을 높일 수 있고, 개발자들 간의 무언의 약속이므로 때에 따라서 다르게 사용해주자.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2