고급 C 프로그래밍 – 파일 처리와 디렉터리 다루기 – 0 – 파일 열기와 닫기

고급 C 프로그래밍 – 파일 처리와 디렉터리 다루기 – 0편: 파일 열기와 닫기

안녕하세요, C 언어 마스터를 향해 나아가는 여러분! 😊
오늘부터는 C 언어에서 파일을 읽고 쓰고 조작하는 법,
그리고 디렉터리 구조를 다루는 방법까지 깊이 있게 다뤄보는 시간을 가져볼 거예요.

그 시작으로 오늘은 파일 열기와 닫기,
즉, C 언어의 fopen()fclose()를 중심으로
파일 처리의 기초를 완전정복해보겠습니다!

🗂 “파일을 다루는 건 마치 금고를 여는 것과 같아요.
열고 → 사용하고 → 닫아야 하죠!”


1. 파일이란 무엇인가요?

파일은 우리가 프로그램 밖에서 데이터를 보관하는 공간이에요.
텍스트, 숫자, 구조체 등 어떤 데이터든 파일로 저장하고 다시 읽어올 수 있죠.

  • 텍스트 파일: .txt, .csv, .log

  • 바이너리 파일: .dat, .bin, .exe

2. 파일 처리 흐름 이해하기

C 언어에서 파일을 다룰 때는 다음의 3단계를 따릅니다.

  1. 파일 열기 (fopen)

  2. 파일 사용 (입력/출력)

  3. 파일 닫기 (fclose)

💡 마치 문을 열고 들어가서 작업을 하고, 나갈 때 문을 닫는 것과 같죠!


3. 파일 열기: fopen()

기본 문법

c복사편집FILE *fopen(const char *filename, const char *mode);
  • filename: 열 파일 경로 (상대/절대 경로 가능)

  • mode: 파일 열기 모드 (다음 섹션 참고)

  • 반환값: 성공 시 파일 포인터(FILE*), 실패 시 NULL

4. 파일 열기 모드 종류

모드

의미

존재하지 않는 파일

"r"

읽기 전용

열기 실패

"w"

쓰기 전용

새로 생성

"a"

추가 전용

새로 생성

"r+"

읽기/쓰기

열기 실패

"w+"

읽기/쓰기

새로 생성

"a+"

읽기/추가

새로 생성

"rb"

이진 읽기

열기 실패

"wb"

이진 쓰기

새로 생성

📌 텍스트 파일은 "r", "w" 등을 사용하고,
바이너리 파일은 "rb", "wb"처럼 **’b’**를 붙여 사용합니다.


5. 파일 열기 예제

c복사편집#include <stdio.h>

int main() {
    FILE *fp = fopen("data.txt", "r");
    if (fp == NULL) {
        printf("파일을 열 수 없습니다.
");
        return 1;
    }

    // 파일 사용 코드 ...

    fclose(fp);
    return 0;
}

fopen()은 항상 반환값 NULL 체크를 해야 합니다!
파일이 없거나 권한이 없으면 실패할 수 있어요.


6. 파일 닫기: fclose()

파일을 다 사용한 후에는 반드시 닫아주어야 합니다.

c복사편집int fclose(FILE *stream);
  • 반환값: 성공 시 0, 실패 시 EOF (-1)

  • 내부 버퍼가 있다면 fclose() 시 자동으로 **버퍼 플러시(flush)**까지 수행됨

예시

c복사편집FILE *fp = fopen("test.txt", "w");
// ... 파일에 쓰기 작업 ...
fclose(fp);  // 닫기

🧠 파일을 열고 닫지 않으면 메모리 누수,
심지어는 데이터가 디스크에 저장되지 않을 수도 있어요!


7. fopen()과 fclose() 비유로 이해하기

  • fopen()은 책을 책꽂이에서 꺼내서 펼치는 것

  • fclose()는 다 읽고 책을 덮고 책꽂이에 다시 꽂는 것

✅ 책을 덮지 않으면 다음 사람이 읽기 어렵겠죠?
마찬가지로 파일도 반드시 닫아야 합니다!


8. 절대 경로 vs 상대 경로

c복사편집FILE *fp1 = fopen("log.txt", "w");           // 상대 경로
FILE *fp2 = fopen("C:/logs/log.txt", "w");   // 절대 경로
  • 상대 경로: 현재 실행 디렉터리를 기준

  • 절대 경로: 파일 시스템 루트부터 명시

Windows는 \\ 또는 /, Linux는 / 사용


9. fopen() 오류 처리 방법

파일 존재 여부 검사

c복사편집FILE *fp = fopen("data.txt", "r");
if (fp == NULL) {
    perror("파일 열기 실패");
    return 1;
}

perror()는 시스템에서 오류 메시지를 자동 출력해줘서
디버깅에 매우 유용해요!


10. 실수 방지 꿀팁

실수

해결 방법

파일 닫지 않음

fclose()꼭 함께 쓰기

NULL 체크 안 함

if (fp == NULL) 검사

잘못된 모드 사용

"r", "w", "a" 등의 의미 확실히 알기

잘못된 경로 입력

상대 경로 vs 절대 경로 확인하기

파일 이름 오타

.txt, .csv 등 확장자 포함 주의


✅ 요약 정리

함수

설명

fopen()

파일 열기, 파일 포인터 반환

fclose()

파일 닫기, 버퍼 플러시도 자동 수행

모드

"r", "w", "a", "r+", "rb" 등 용도별 사용

체크

NULL 체크, 경로/확장자 오류 주의


마무리하며 💬

C 언어에서 파일을 다룬다는 건
데이터를 프로그램 밖으로 옮기고, 다시 불러오며,
현실 세계와 소통하는 관문을 여는 일입니다.

🎯 “파일은 프로그램의 눈과 귀다.
잘 열고, 잘 닫아야 좋은 프로그램이 된다!”

다음 시간에는 실제로 파일을 읽고 쓰는 방법
문자열, 숫자 데이터를 어떻게 다루는지 더 깊이 있게 알아보겠습니다.
기대 많이 해주세요! 💻📄🔥

답글 남기기