Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C언어 fopen() 함수 – 쓰기 모드("w")로 기존 파일을 열 때의 동작 원리

C 언어에서 fopen() 함수는 포인터가 가리키는 파일을 열어 읽거나 쓸 수 있게 해주는 표준 라이브러리 함수입니다. 이때 쓰기 모드에서는 "w", 읽기 모드에서는 "r"을 접근 모드로 지정합니다.

특히 주의할 점은, 디렉터리에 같은 이름의 파일이 이미 존재하는 상태에서 쓰기 모드("w")로 파일을 열면 기존 파일이 비어 있는 새 파일처럼 취급된다는 것입니다. 즉, 파일 안에 있던 기존 내용은 모두 사라지고 새로 작성하는 데이터로 완전히 덮어써집니다.

fopen() 함수의 문법

FILE *fopen(const char *filename, const char *access_mode)

각 매개변수의 의미는 다음과 같습니다.

  • filename − 열고자 하는 파일의 이름(경로 포함 가능)
  • access_mode − 파일에 접근할 모드 (예: 읽기 "r", 쓰기 "w", 추가 "a" 등)

예제

먼저 다음과 같은 내용을 담고 있는 "one.txt" 파일이 있다고 가정해 보겠습니다.

This is demo text!
This is demo text!
This is demo text!

아래 예제는 fopen()으로 파일을 연 뒤, fseek()와 ftell()을 이용해 파일 크기를 구하는 프로그램입니다.

#include <stdio.h>

int main() {
    FILE *f;
    int len;

    f = fopen("one.txt", "r");
    if (f == NULL) {
        perror("Error opening file");
        return (-1);
    }

    fseek(f, 0, SEEK_END);
    len = ftell(f);
    fclose(f);

    printf("Size of file: %d bytes\n", len);
    return 0;
}

실행 결과

Size of file: 78 bytes

코드 설명

위 프로그램에서는 먼저 파일 포인터 변수 f를 선언하고, fopen() 함수를 호출해 "one.txt" 파일을 엽니다.

FILE *f;
int len;
f = fopen("one.txt", "r");

파일 열기에 실패하면 f에는 NULL이 반환되므로, 반드시 NULL 여부를 검사한 후 perror()로 오류 메시지를 출력하는 것이 안전합니다.

쓰기 모드("w")에서 기존 파일을 열 경우

만약 위 예제에서 접근 모드를 "w"로 바꾸어 파일을 열면 어떻게 될까요?

f = fopen("one.txt", "w");
if (f == NULL) {
    perror("Error opening file");
    return (-1);
}
fprintf(f, "This is new text!");
fclose(f);

이 경우 "one.txt"가 이미 존재하기 때문에, 파일의 길이는 즉시 0이 되고 기존에 있던 내용은 모두 삭제됩니다. 이후 fprintf() 등으로 작성한 새로운 데이터만 파일에 남게 됩니다. 따라서 기존 파일의 내용을 보존하면서 데이터를 추가하고 싶다면 쓰기 모드 대신 추가 모드("a")를 사용해야 합니다.

참고: 주요 접근 모드 정리

  • "r" : 읽기 전용. 파일이 없으면 실패(NULL 반환)
  • "w" : 쓰기 전용. 파일이 없으면 새로 생성, 있으면 내용을 모두 지우고 처음부터 작성
  • "a" : 추가(append) 전용. 파일 끝에 데이터를 이어서 작성
  • "r+", "w+", "a+" : 읽기와 쓰기를 모두 지원하는 모드