C언어 초급 - 12장: 파일 입출력 (12.2 텍스트 파일 읽기/쓰기)

2025. 2. 24. 11:59프로그래밍 언어/C

12.2 텍스트 파일 읽기/쓰기

C 언어에서 텍스트 파일을 읽고 쓰는 기능을 제공하는 함수로 fprintf(), fscanf(), fgets(), fputs() 등이 있습니다.
이 함수들을 활용하면 파일에 데이터를 저장하고, 저장된 데이터를 다시 읽어올 수 있습니다.


1. fprintf()와 fscanf() - 파일에 형식화된 데이터 읽기/쓰기

1.1 fprintf() - 파일에 형식화된 데이터 쓰기

fprintf() 함수는 파일에 형식화된 데이터를 출력하는 함수입니다.
printf() 함수와 동일한 형식 지정자를 사용하지만, 출력 대상이 파일이라는 점이 다릅니다.

📌 문법

int fprintf(FILE *fp, const char *format, ...);
  • fp → 파일 포인터.
  • format → 출력할 형식 문자열 (printf()와 동일).
  • 반환값: 성공 시 출력한 문자 개수, 실패 시 음수 반환.

1.2 fprintf() 사용 예제

#include <stdio.h>

int main() {
    FILE *fp = fopen("data.txt", "w");  // 파일 쓰기 모드로 열기

    if (fp == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fprintf(fp, "이름: %s, 나이: %d, 키: %.1fcm\n", "홍길동", 25, 175.5);
    fprintf(fp, "이름: %s, 나이: %d, 키: %.1fcm\n", "김영희", 30, 162.3);

    fclose(fp);  // 파일 닫기
    printf("데이터 저장 완료\n");

    return 0;
}

출력 결과 (data.txt 내용)

이름: 홍길동, 나이: 25, 키: 175.5cm
이름: 김영희, 나이: 30, 키: 162.3cm

📌 설명

  • fprintf(fp, "이름: %s, 나이: %d, 키: %.1fcm\n", "홍길동", 25, 175.5);
    • fp 파일에 문자열을 저장.
    • printf()와 동일한 형식 지정자를 사용.

1.3 fscanf() - 파일에서 형식화된 데이터 읽기

fscanf() 함수는 파일에서 특정 형식의 데이터를 읽는 함수입니다.
scanf()와 동일한 방식으로 동작하지만, 입력 대상이 파일이라는 점이 다릅니다.

📌 문법

int fscanf(FILE *fp, const char *format, ...);
  • fp → 파일 포인터.
  • format → 읽어올 데이터의 형식 문자열.
  • 반환값: 성공적으로 읽은 항목 개수, 실패 시 EOF 반환.

1.4 fscanf() 사용 예제

#include <stdio.h>

int main() {
    FILE *fp = fopen("data.txt", "r");  // 파일 읽기 모드로 열기

    if (fp == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    char name[20];
    int age;
    float height;

    while (fscanf(fp, "이름: %s, 나이: %d, 키: %fcm\n", name, &age, &height) != EOF) {
        printf("이름: %s, 나이: %d, 키: %.1fcm\n", name, age, height);
    }

    fclose(fp);  // 파일 닫기
    return 0;
}

출력 결과

이름: 홍길동, 나이: 25, 키: 175.5cm
이름: 김영희, 나이: 30, 키: 162.3cm

📌 설명

  • fscanf()를 사용하여 data.txt에서 데이터를 한 줄씩 읽음.
  • while 루프를 사용하여 EOF(End of File) 까지 반복.

파일에서 형식화된 데이터를 다룰 때 매우 유용함!
단, 공백이 포함된 문자열을 읽을 때는 fscanf()보다 fgets()를 사용해야 함.


2. fgets()와 fputs() - 문자열 입출력

2.1 fgets() - 파일에서 한 줄씩 읽기

fgets() 함수는 파일에서 한 줄(\n 포함)씩 읽어오는 함수입니다.

📌 문법

char *fgets(char *str, int size, FILE *fp);
  • str → 읽어온 데이터를 저장할 문자열 배열.
  • size → 읽을 최대 문자 수 (버퍼 크기).
  • fp → 파일 포인터.
  • 반환값: 성공 시 문자열 포인터 반환, 실패 또는 파일 끝(EOF) 도달 시 NULL 반환.

2.2 fgets() 사용 예제

#include <stdio.h>

int main() {
    FILE *fp = fopen("data.txt", "r");  // 파일 읽기 모드

    if (fp == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    char buffer[100];

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

    fclose(fp);  // 파일 닫기
    return 0;
}

출력 결과 (data.txt 내용)

이름: 홍길동, 나이: 25, 키: 175.5cm
이름: 김영희, 나이: 30, 키: 162.3cm

📌 설명

  • fgets(buffer, sizeof(buffer), fp) → 한 줄씩 읽어 buffer에 저장.
  • 공백이 포함된 문자열도 읽을 수 있음! (fscanf()는 공백을 인식하지 못함).

파일에서 텍스트 데이터를 읽을 때 fgets()이 가장 안전한 방법!


2.3 fputs() - 파일에 문자열 저장

fputs() 함수는 파일에 문자열을 저장하는 함수입니다.

📌 문법

int fputs(const char *str, FILE *fp);
  • str → 저장할 문자열.
  • fp → 파일 포인터.
  • 반환값: 성공 시 0, 실패 시 EOF 반환.

2.4 fputs() 사용 예제

#include <stdio.h>

int main() {
    FILE *fp = fopen("output.txt", "w");  // 파일 쓰기 모드

    if (fp == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fputs("Hello, File I/O!\n", fp);
    fputs("파일 입출력을 배우는 중입니다.\n", fp);

    fclose(fp);  // 파일 닫기
    printf("파일 저장 완료\n");

    return 0;
}

출력 결과 (output.txt 내용)

Hello, File I/O!
파일 입출력을 배우는 중입니다.

📌 설명

  • fputs("Hello, File I/O!\n", fp); → 문자열을 파일에 저장.
  • \n을 명시적으로 넣어야 줄바꿈 적용.

텍스트 데이터를 저장할 때 fputs()를 사용하면 간단하고 안전함!


3. 정리

함수 설명  예제
fprintf() 파일에 형식화된 데이터 쓰기 fprintf(fp, "%d %s", age, name);
fscanf() 파일에서 형식화된 데이터 읽기 fscanf(fp, "%d %s", &age, name);
fgets() 파일에서 한 줄 읽기 fgets(buffer, 100, fp);
fputs() 파일에 문자열 저장 fputs("Hello!", fp);

📌 텍스트 데이터를 파일에 저장할 때 fprintf()와 fputs() 사용
📌 파일에서 데이터를 읽을 때 fscanf()와 fgets() 사용
📌 공백이 포함된 문자열을 읽을 때는 fgets()이 가장 안전함!