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

C 언어 표준 API - stdio.h의 파일 입출력 (fopen, fclose, fread, fwrite)

임베디드 친구 2025. 2. 5. 11:04
728x90
반응형

C 언어에서 파일 입출력은 표준 라이브러리 <stdio.h>를 통해 수행됩니다. 오늘은 파일을 열고 닫는 fopen, fclose 함수와, 파일에서 데이터를 읽고 쓰는 fread, fwrite 함수에 대해 살펴보겠습니다.

1. fopen: 파일 열기

fopen 함수는 파일을 열고, 해당 파일과 연관된 FILE 포인터를 반환합니다. 기본적인 사용법은 다음과 같습니다.

#include <stdio.h>

int main() {
    FILE *fp = fopen("example.txt", "w");
    if (fp == NULL) {
        perror("파일 열기 실패");
        return 1;
    }
    printf("파일 열기 성공!\n");
    fclose(fp);
    return 0;
}

fopen의 모드

fopen 함수의 두 번째 인수로 파일을 여는 모드를 지정할 수 있습니다.

모드 설명
"r" 읽기 모드 (파일이 존재해야 함)
"w" 쓰기 모드 (파일이 존재하면 초기화됨)
"a" 추가 모드 (파일 끝에 데이터 추가)
"r+" 읽기/쓰기 모드 (파일이 존재해야 함)
"w+" 읽기/쓰기 모드 (파일이 존재하면 초기화됨)
"a+" 읽기/쓰기 모드 (파일 끝에 데이터 추가)

2. fclose: 파일 닫기

파일을 다 사용한 후에는 반드시 fclose 함수를 호출하여 파일을 닫아야 합니다. 그렇지 않으면 데이터 손실이나 메모리 누수가 발생할 수 있습니다.

#include <stdio.h>

int main() {
    FILE *fp = fopen("example.txt", "w");
    if (fp == NULL) {
        perror("파일 열기 실패");
        return 1;
    }
    fclose(fp);
    printf("파일 닫기 완료!\n");
    return 0;
}

3. fwrite: 파일에 데이터 쓰기

fwrite 함수는 바이너리 데이터를 파일에 씁니다.

#include <stdio.h>

int main() {
    FILE *fp = fopen("data.bin", "wb");
    if (fp == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    int numbers[] = {1, 2, 3, 4, 5};
    size_t written = fwrite(numbers, sizeof(int), 5, fp);

    if (written != 5) {
        perror("파일 쓰기 실패");
    } else {
        printf("파일 쓰기 성공!\n");
    }

    fclose(fp);
    return 0;
}

fwrite의 인수

  • 첫 번째 인수: 쓰려는 데이터의 포인터
  • 두 번째 인수: 각 데이터 요소의 크기 (바이트 단위)
  • 세 번째 인수: 쓰려는 데이터 요소의 개수
  • 네 번째 인수: 파일 포인터

4. fread: 파일에서 데이터 읽기

fread 함수는 바이너리 데이터를 파일에서 읽습니다.

#include <stdio.h>

int main() {
    FILE *fp = fopen("data.bin", "rb");
    if (fp == NULL) {
        perror("파일 열기 실패");
        return 1;
    }

    int numbers[5] = {0};
    size_t read = fread(numbers, sizeof(int), 5, fp);

    if (read != 5) {
        perror("파일 읽기 실패");
    } else {
        printf("파일 읽기 성공! 읽은 값들: ");
        for (int i = 0; i < 5; i++) {
            printf("%d ", numbers[i]);
        }
        printf("\n");
    }

    fclose(fp);
    return 0;
}

fread의 인수

  • 첫 번째 인수: 데이터를 저장할 메모리의 포인터
  • 두 번째 인수: 각 데이터 요소의 크기
  • 세 번째 인수: 읽을 데이터 요소의 개수
  • 네 번째 인수: 파일 포인터

5. 종합 예제: 파일 저장 및 불러오기

아래 예제는 fwrite로 데이터를 저장한 후, fread로 다시 불러오는 과정입니다.

#include <stdio.h>

int main() {
    FILE *fp;
    int data[] = {10, 20, 30, 40, 50};
    int buffer[5];

    // 파일 쓰기
    fp = fopen("example.bin", "wb");
    if (fp == NULL) {
        perror("파일 열기 실패");
        return 1;
    }
    fwrite(data, sizeof(int), 5, fp);
    fclose(fp);

    // 파일 읽기
    fp = fopen("example.bin", "rb");
    if (fp == NULL) {
        perror("파일 열기 실패");
        return 1;
    }
    fread(buffer, sizeof(int), 5, fp);
    fclose(fp);

    printf("파일에서 읽은 데이터: ");
    for (int i = 0; i < 5; i++) {
        printf("%d ", buffer[i]);
    }
    printf("\n");

    return 0;
}

마무리

오늘은 C 언어에서 파일을 다루는 fopen, fclose, fread, fwrite 함수에 대해 살펴보았습니다. 파일을 올바르게 열고 닫는 것이 중요하며, freadfwrite를 사용하여 데이터를 효율적으로 입출력할 수 있습니다. 실전 프로젝트에서 파일 입출력이 필요한 경우, 이러한 함수들을 활용하여 안정적인 프로그램을 개발해 보세요!

반응형