C언어 초급 - 12장: 파일 입출력 (12.2 텍스트 파일 읽기/쓰기)
2025. 2. 24. 11:59ㆍ프로그래밍 언어/C
12.2 텍스트 파일 읽기/쓰기
C 언어에서 텍스트 파일을 읽고 쓰는 기능을 제공하는 함수로 fprintf(), fscanf(), fgets(), fputs() 등이 있습니다.
이 함수들을 활용하면 파일에 데이터를 저장하고, 저장된 데이터를 다시 읽어올 수 있습니다.
1. fprintf()와 fscanf() - 파일에 형식화된 데이터 읽기/쓰기
1.1 fprintf() - 파일에 형식화된 데이터 쓰기
fprintf() 함수는 파일에 형식화된 데이터를 출력하는 함수입니다.
printf() 함수와 동일한 형식 지정자를 사용하지만, 출력 대상이 파일이라는 점이 다릅니다.
📌 문법
int fprintf(FILE *fp, const char *format, ...);
- fp → 파일 포인터.
- format → 출력할 형식 문자열 (printf()와 동일).
- 반환값: 성공 시 출력한 문자 개수, 실패 시 음수 반환.
1.2 fprintf() 사용 예제
#include <stdio.h>
int main() {
FILE *fp = fopen("data.txt", "w"); // 파일 쓰기 모드로 열기
if (fp == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
fprintf(fp, "이름: %s, 나이: %d, 키: %.1fcm\n", "홍길동", 25, 175.5);
fprintf(fp, "이름: %s, 나이: %d, 키: %.1fcm\n", "김영희", 30, 162.3);
fclose(fp); // 파일 닫기
printf("데이터 저장 완료\n");
return 0;
}
출력 결과 (data.txt 내용)
이름: 홍길동, 나이: 25, 키: 175.5cm
이름: 김영희, 나이: 30, 키: 162.3cm
📌 설명
- fprintf(fp, "이름: %s, 나이: %d, 키: %.1fcm\n", "홍길동", 25, 175.5);
- fp 파일에 문자열을 저장.
- printf()와 동일한 형식 지정자를 사용.
1.3 fscanf() - 파일에서 형식화된 데이터 읽기
fscanf() 함수는 파일에서 특정 형식의 데이터를 읽는 함수입니다.
scanf()와 동일한 방식으로 동작하지만, 입력 대상이 파일이라는 점이 다릅니다.
📌 문법
int fscanf(FILE *fp, const char *format, ...);
- fp → 파일 포인터.
- format → 읽어올 데이터의 형식 문자열.
- 반환값: 성공적으로 읽은 항목 개수, 실패 시 EOF 반환.
1.4 fscanf() 사용 예제
#include <stdio.h>
int main() {
FILE *fp = fopen("data.txt", "r"); // 파일 읽기 모드로 열기
if (fp == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
char name[20];
int age;
float height;
while (fscanf(fp, "이름: %s, 나이: %d, 키: %fcm\n", name, &age, &height) != EOF) {
printf("이름: %s, 나이: %d, 키: %.1fcm\n", name, age, height);
}
fclose(fp); // 파일 닫기
return 0;
}
출력 결과
이름: 홍길동, 나이: 25, 키: 175.5cm
이름: 김영희, 나이: 30, 키: 162.3cm
📌 설명
- fscanf()를 사용하여 data.txt에서 데이터를 한 줄씩 읽음.
- while 루프를 사용하여 EOF(End of File) 까지 반복.
✅ 파일에서 형식화된 데이터를 다룰 때 매우 유용함!
✅ 단, 공백이 포함된 문자열을 읽을 때는 fscanf()보다 fgets()를 사용해야 함.
2. fgets()와 fputs() - 문자열 입출력
2.1 fgets() - 파일에서 한 줄씩 읽기
fgets() 함수는 파일에서 한 줄(\n 포함)씩 읽어오는 함수입니다.
📌 문법
char *fgets(char *str, int size, FILE *fp);
- str → 읽어온 데이터를 저장할 문자열 배열.
- size → 읽을 최대 문자 수 (버퍼 크기).
- fp → 파일 포인터.
- 반환값: 성공 시 문자열 포인터 반환, 실패 또는 파일 끝(EOF) 도달 시 NULL 반환.
2.2 fgets() 사용 예제
#include <stdio.h>
int main() {
FILE *fp = fopen("data.txt", "r"); // 파일 읽기 모드
if (fp == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
char buffer[100];
while (fgets(buffer, sizeof(buffer), fp) != NULL) {
printf("%s", buffer);
}
fclose(fp); // 파일 닫기
return 0;
}
출력 결과 (data.txt 내용)
이름: 홍길동, 나이: 25, 키: 175.5cm
이름: 김영희, 나이: 30, 키: 162.3cm
📌 설명
- fgets(buffer, sizeof(buffer), fp) → 한 줄씩 읽어 buffer에 저장.
- 공백이 포함된 문자열도 읽을 수 있음! (fscanf()는 공백을 인식하지 못함).
✅ 파일에서 텍스트 데이터를 읽을 때 fgets()이 가장 안전한 방법!
2.3 fputs() - 파일에 문자열 저장
fputs() 함수는 파일에 문자열을 저장하는 함수입니다.
📌 문법
int fputs(const char *str, FILE *fp);
- str → 저장할 문자열.
- fp → 파일 포인터.
- 반환값: 성공 시 0, 실패 시 EOF 반환.
2.4 fputs() 사용 예제
#include <stdio.h>
int main() {
FILE *fp = fopen("output.txt", "w"); // 파일 쓰기 모드
if (fp == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
fputs("Hello, File I/O!\n", fp);
fputs("파일 입출력을 배우는 중입니다.\n", fp);
fclose(fp); // 파일 닫기
printf("파일 저장 완료\n");
return 0;
}
출력 결과 (output.txt 내용)
Hello, File I/O!
파일 입출력을 배우는 중입니다.
📌 설명
- fputs("Hello, File I/O!\n", fp); → 문자열을 파일에 저장.
- \n을 명시적으로 넣어야 줄바꿈 적용.
✅ 텍스트 데이터를 저장할 때 fputs()를 사용하면 간단하고 안전함!
3. 정리
함수 | 설명 | 예제 |
fprintf() | 파일에 형식화된 데이터 쓰기 | fprintf(fp, "%d %s", age, name); |
fscanf() | 파일에서 형식화된 데이터 읽기 | fscanf(fp, "%d %s", &age, name); |
fgets() | 파일에서 한 줄 읽기 | fgets(buffer, 100, fp); |
fputs() | 파일에 문자열 저장 | fputs("Hello!", fp); |
📌 텍스트 데이터를 파일에 저장할 때 fprintf()와 fputs() 사용
📌 파일에서 데이터를 읽을 때 fscanf()와 fgets() 사용
📌 공백이 포함된 문자열을 읽을 때는 fgets()이 가장 안전함!
'프로그래밍 언어 > C' 카테고리의 다른 글
C언어 초급 - 13장: 구조체와 공용체 (13.1 구조체 (struct)) (0) | 2025.02.24 |
---|---|
C언어 초급 - 12장: 파일 입출력 (12.3 바이너리 파일 읽기/쓰기) (0) | 2025.02.24 |
C언어 초급 - 12장: 파일 입출력 (12.1 파일 입출력 개요) (0) | 2025.02.24 |
C언어 초급 - 11장: 동적 메모리 할당 (11.2 메모리 누수 방지와 free() 함수의 중요성) (0) | 2025.02.24 |
C언어 초급 - 11장: 동적 메모리 할당 (11.1 동적 메모리 할당의 필요성) (0) | 2025.02.24 |