c 언어/c 표준 라이브러리(Standard C Library)

C언어 표준 입출력 (stdio.h) - fprintf와 fscanf 사용법

임베디드 친구 2025. 2. 6. 10:38
728x90
반응형

C언어에서 파일 입출력은 매우 중요한 기능 중 하나입니다. 표준 라이브러리인 stdio.h를 사용하면 파일을 읽고 쓸 수 있으며, 특히 fprintffscanf는 포맷팅된 데이터를 파일에 기록하거나 읽을 때 유용합니다. 이번 포스팅에서는 fprintffscanf의 기본 개념과 사용법을 살펴보고, 실용적인 예제를 통해 이해를 돕겠습니다.

1. fprintf와 fscanf 개요

fprintf 함수

fprintf 함수는 포맷을 지정하여 파일에 데이터를 출력하는 함수입니다. printf와 비슷한 방식으로 동작하지만, 결과를 표준 출력이 아닌 파일에 기록합니다.

fprintf 함수 원형

int fprintf(FILE *stream, const char *format, ...);
  • stream: 출력할 파일의 포인터
  • format: 출력 형식을 지정하는 포맷 문자열
  • ...: 출력할 데이터 목록

반환값은 출력한 문자의 개수이며, 출력 오류가 발생하면 음수를 반환합니다.

fscanf 함수

fscanf 함수는 파일에서 데이터를 읽어들이고, 이를 특정 형식으로 변환하는 함수입니다. scanf와 유사하지만 입력이 파일에서 이루어집니다.

fscanf 함수 원형

int fscanf(FILE *stream, const char *format, ...);
  • stream: 입력을 읽을 파일의 포인터
  • format: 입력 데이터의 형식을 지정하는 포맷 문자열
  • ...: 데이터를 저장할 변수 목록 (포인터 형태)

반환값은 성공적으로 읽은 항목의 개수이며, 파일의 끝(EOF)을 만나거나 오류가 발생하면 EOF(-1)를 반환합니다.

2. fprintf와 fscanf 기본 예제

아래 예제는 fprintf를 사용하여 데이터를 파일에 저장하고, fscanf로 다시 읽어오는 코드입니다.

#include <stdio.h>

int main() {
    FILE *file;
    int id;
    char name[20];
    float score;

    // 파일 쓰기 (쓰기 모드 "w")
    file = fopen("student.txt", "w");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    fprintf(file, "%d %s %.2f\n", 101, "Kim", 95.5);
    fprintf(file, "%d %s %.2f\n", 102, "Lee", 88.0);
    fclose(file);

    // 파일 읽기 (읽기 모드 "r")
    file = fopen("student.txt", "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    printf("ID    Name    Score\n");
    printf("--------------------\n");
    while (fscanf(file, "%d %s %f", &id, name, &score) != EOF) {
        printf("%d    %s    %.2f\n", id, name, score);
    }
    fclose(file);

    return 0;
}

실행 결과

ID    Name    Score
--------------------
101    Kim    95.50
102    Lee    88.00

이 예제에서는 fprintf를 사용하여 학생 정보를 파일에 저장하고, fscanf로 다시 읽어 출력합니다.

3. 응용: 여러 개의 데이터 읽기

실제 응용에서는 여러 개의 데이터를 반복적으로 읽어야 할 때가 많습니다. 예제에서 while 문을 사용하여 EOF를 만날 때까지 파일을 읽는 방식을 활용하면, 개수가 정해지지 않은 데이터도 처리할 수 있습니다.

아래는 여러 개의 데이터를 파일에 저장하고 읽는 예제입니다.

#include <stdio.h>

#define FILE_NAME "data.txt"
#define MAX_ENTRIES 100

int main() {
    FILE *file;
    int i, num;
    int values[MAX_ENTRIES];

    // 파일 쓰기
    file = fopen(FILE_NAME, "w");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }
    for (i = 1; i <= 5; i++) {
        fprintf(file, "%d\n", i * 10);
    }
    fclose(file);

    // 파일 읽기
    file = fopen(FILE_NAME, "r");
    if (file == NULL) {
        printf("파일을 열 수 없습니다.\n");
        return 1;
    }

    printf("파일에서 읽은 값:\n");
    i = 0;
    while (fscanf(file, "%d", &values[i]) != EOF) {
        printf("%d ", values[i]);
        i++;
    }
    fclose(file);

    return 0;
}

실행 결과

파일에서 읽은 값:
10 20 30 40 50

4. fprintf와 fscanf 사용 시 주의점

  1. 파일 포인터 검사: fopen()의 반환값이 NULL인지 확인해야 합니다. 파일이 존재하지 않거나 접근 권한이 없을 경우 프로그램이 예상치 못한 동작을 할 수 있습니다.
  2. 버퍼링 문제: fprintf를 사용한 후 fclose 또는 fflush를 호출하여 데이터가 실제로 기록되었는지 확인해야 합니다.
  3. fscanf의 입력 형식: fscanf를 사용할 때 입력 형식이 잘못되면 예상과 다른 결과가 나올 수 있으므로 주의해야 합니다.
  4. 데이터 오버플로우 방지: 문자열을 입력받을 경우 fscanf(file, "%19s", name);처럼 버퍼 크기를 제한하는 것이 좋습니다.

5. 마무리

fprintffscanf는 파일 입출력에서 매우 유용한 함수입니다. fprintf를 사용하면 포맷팅된 데이터를 손쉽게 파일에 기록할 수 있으며, fscanf를 이용하면 원하는 형식으로 데이터를 읽을 수 있습니다. 이번 포스팅에서 다룬 예제를 직접 실행해보면서 C 언어의 파일 입출력 기능을 익혀보세요!

반응형