고급 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 등 수많은 현실 문제를 해결하는 핵심 기술입니다.
🎯 “프로그래밍은 메모리와의 대화,
파일 입출력은 세상과의 대화입니다!”
다음 편에서는 바이너리 파일 입출력을 통해
좀 더 다양한 형태의 데이터를 보다 압축적이고 정교하게 저장하는 방법을 알아볼게요!
계속 함께해요! 💻📄✨