고급 C 프로그래밍 – 파일 처리와 디렉터리 다루기 – 1 – 텍스트 파일 입출력

고급 C 프로그래밍 – 파일 처리와 디렉터리 다루기 – 1편: 텍스트 파일 입출력

안녕하세요, 여러분! 😊
오늘은 C 언어의 파일 처리 기능 중 가장 자주 사용되는 텍스트 파일 입출력에 대해 알아보겠습니다.

📝 텍스트 파일은 마치 다이어리나 메모장 같아요.
우리가 적은 내용을 저장하고, 다시 불러올 수 있는 가장 친근한 파일 형태죠!

이번 시간엔 fprintf, fscanf, fgets, fputs, fgetc, fputc 같은 함수들을 사용해
텍스트 데이터를 어떻게 파일로 쓰고, 읽을 수 있는지 완전히 이해해볼게요!


1. 텍스트 파일이란?

텍스트 파일은 사람이 읽을 수 있는 형태의 데이터를 저장한 파일입니다.
주로 .txt, .log, .csv 같은 파일이 여기에 해당되죠.

txt복사편집홍길동, 30
김영희, 25

텍스트 파일은 한 줄씩 혹은 문자 단위로 입출력하는 방식이 일반적입니다.


2. 텍스트 파일 쓰기 – fprintf, fputs, fputc

1) fprintf(): 형식을 지정해서 쓰기

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

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

    fprintf(fp, "이름: %s, 나이: %d
", "홍길동", 30);
    fprintf(fp, "이름: %s, 나이: %d
", "김영희", 25);

    fclose(fp);
    return 0;
}

💡 printf의 파일 버전이라고 보면 됩니다!
데이터를 형식 지정하여 텍스트 파일에 기록할 수 있어요.


2) fputs(): 문자열 그대로 쓰기

c복사편집fputs("Hello, world!
", fp);
  • 을 붙이지 않으면 줄바꿈이 되지 않아요.

  • 문자열 전체를 한 번에 출력할 때 유용해요.

3) fputc(): 한 글자씩 쓰기

c복사편집fputc('A', fp);
fputc('
', fp);
  • 문자 단위로 기록합니다.

  • 루프에서 한 글자씩 출력할 때 자주 써요.

3. 텍스트 파일 읽기 – fscanf, fgets, fgetc

1) fscanf(): 형식 지정하여 읽기

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

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

    char name[20];
    int age;

    while (fscanf(fp, "이름: %[^,], 나이: %d
", name, &age) == 2) {
        printf("읽음 → 이름: %s, 나이: %d
", name, age);
    }

    fclose(fp);
    return 0;
}

🧠 fscanf는 형식이 정확히 맞아야 읽힐 수 있어요.
형식이 바뀌면 오류 발생 가능성도 커요!


2) fgets(): 한 줄씩 읽기

c복사편집char line[100];
while (fgets(line, sizeof(line), fp) != NULL) {
    printf("%s", line);
}
  • 줄 단위로 읽을 수 있어 로그 분석, CSV 처리 등에 적합해요.

  • 개행문자( )도 함께 읽어온다는 점 유의!

3) fgetc(): 문자 단위 읽기

c복사편집int ch;
while ((ch = fgetc(fp)) != EOF) {
    putchar(ch);
}
  • **파일 끝(EOF)**까지 문자 하나씩 읽고 출력합니다.

  • 간단한 텍스트 검사나 문자열 처리 시 사용돼요.

4. 파일에 추가하기 – a 모드 사용

c복사편집FILE *fp = fopen("log.txt", "a");  // 기존 내용 뒤에 추가
fputs("새로운 로그 추가!
", fp);
fclose(fp);
  • w 모드는 기존 내용을 덮어쓰기 때문에 주의!

  • a 모드는 기존 내용을 보존하면서 뒤에 새 데이터를 이어붙입니다.

5. 실전 예제: 사용자 정보 저장

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

int main() {
    FILE *fp = fopen("user_data.txt", "w");
    if (fp == NULL) {
        printf("파일 열기 실패!
");
        return 1;
    }

    char name[20];
    int age;

    for (int i = 0; i < 3; i++) {
        printf("이름 입력: ");
        scanf("%s", name);
        printf("나이 입력: ");
        scanf("%d", &age);

        fprintf(fp, "%s,%d
", name, age);
    }

    fclose(fp);
    return 0;
}

이 예제는 텍스트 파일에 CSV 형식으로 데이터를 저장해요.
나중에 Excel로 열어보면 표처럼 보일 수 있습니다!


6. 자주 하는 실수와 주의사항

실수

해결 방법

fclose() 생략

꼭 닫아야 파일이 저장됩니다!

쓰기 모드 "w"로 열어서 데이터 날림

새로 쓸지, 추가할지 의도에 맞는 모드 사용

줄바꿈 누락

fputs() 사용 시 직접 추가 필요

버퍼 오버플로우

fgets()는 배열 크기 넘지 않도록 주의


✅ 요약 정리

함수

기능

사용 예

fprintf()

서식 있는 출력

fprintf(fp, "이름: %s", name)

fputs()

문자열 출력

fputs("Hello", fp)

fputc()

문자 출력

fputc('A', fp)

fscanf()

서식 있는 입력

fscanf(fp, "%s", str)

fgets()

한 줄 읽기

fgets(line, size, fp)

fgetc()

문자 읽기

fgetc(fp)


마무리하며 💬

C 언어에서 텍스트 파일 입출력은
데이터를 외부와 주고받는 관문이자,
로그, 설정 파일, CSV 등 수많은 현실 문제를 해결하는 핵심 기술입니다.

🎯 “프로그래밍은 메모리와의 대화,
파일 입출력은 세상과의 대화입니다!”

다음 편에서는 바이너리 파일 입출력을 통해
좀 더 다양한 형태의 데이터를 보다 압축적이고 정교하게 저장하는 방법을 알아볼게요!
계속 함께해요! 💻📄✨

답글 남기기