C언어에서 파일 입출력은 매우 중요한 기능 중 하나입니다. 표준 라이브러리인 stdio.h
를 사용하면 파일을 읽고 쓸 수 있으며, 특히 fprintf
와 fscanf
는 포맷팅된 데이터를 파일에 기록하거나 읽을 때 유용합니다. 이번 포스팅에서는 fprintf
와 fscanf
의 기본 개념과 사용법을 살펴보고, 실용적인 예제를 통해 이해를 돕겠습니다.
1. fprintf와 fscanf 개요
fprintf 함수
fprintf
함수는 포맷을 지정하여 파일에 데이터를 출력하는 함수입니다. printf
와 비슷한 방식으로 동작하지만, 결과를 표준 출력이 아닌 파일에 기록합니다.
fprintf
함수 원형
int fprintf(FILE *stream, const char *format, ...);
stream
: 출력할 파일의 포인터format
: 출력 형식을 지정하는 포맷 문자열...
: 출력할 데이터 목록
반환값은 출력한 문자의 개수이며, 출력 오류가 발생하면 음수를 반환합니다.
fscanf 함수
fscanf
함수는 파일에서 데이터를 읽어들이고, 이를 특정 형식으로 변환하는 함수입니다. scanf
와 유사하지만 입력이 파일에서 이루어집니다.
fscanf
함수 원형
int fscanf(FILE *stream, const char *format, ...);
stream
: 입력을 읽을 파일의 포인터format
: 입력 데이터의 형식을 지정하는 포맷 문자열...
: 데이터를 저장할 변수 목록 (포인터 형태)
반환값은 성공적으로 읽은 항목의 개수이며, 파일의 끝(EOF)을 만나거나 오류가 발생하면 EOF
(-1)를 반환합니다.
2. fprintf와 fscanf 기본 예제
아래 예제는 fprintf
를 사용하여 데이터를 파일에 저장하고, fscanf
로 다시 읽어오는 코드입니다.
#include <stdio.h>
int main() {
FILE *file;
int id;
char name[20];
float score;
// 파일 쓰기 (쓰기 모드 "w")
file = fopen("student.txt", "w");
if (file == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
fprintf(file, "%d %s %.2f\n", 101, "Kim", 95.5);
fprintf(file, "%d %s %.2f\n", 102, "Lee", 88.0);
fclose(file);
// 파일 읽기 (읽기 모드 "r")
file = fopen("student.txt", "r");
if (file == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
printf("ID Name Score\n");
printf("--------------------\n");
while (fscanf(file, "%d %s %f", &id, name, &score) != EOF) {
printf("%d %s %.2f\n", id, name, score);
}
fclose(file);
return 0;
}
실행 결과
ID Name Score
--------------------
101 Kim 95.50
102 Lee 88.00
이 예제에서는 fprintf
를 사용하여 학생 정보를 파일에 저장하고, fscanf
로 다시 읽어 출력합니다.
3. 응용: 여러 개의 데이터 읽기
실제 응용에서는 여러 개의 데이터를 반복적으로 읽어야 할 때가 많습니다. 예제에서 while
문을 사용하여 EOF
를 만날 때까지 파일을 읽는 방식을 활용하면, 개수가 정해지지 않은 데이터도 처리할 수 있습니다.
아래는 여러 개의 데이터를 파일에 저장하고 읽는 예제입니다.
#include <stdio.h>
#define FILE_NAME "data.txt"
#define MAX_ENTRIES 100
int main() {
FILE *file;
int i, num;
int values[MAX_ENTRIES];
// 파일 쓰기
file = fopen(FILE_NAME, "w");
if (file == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
for (i = 1; i <= 5; i++) {
fprintf(file, "%d\n", i * 10);
}
fclose(file);
// 파일 읽기
file = fopen(FILE_NAME, "r");
if (file == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
printf("파일에서 읽은 값:\n");
i = 0;
while (fscanf(file, "%d", &values[i]) != EOF) {
printf("%d ", values[i]);
i++;
}
fclose(file);
return 0;
}
실행 결과
파일에서 읽은 값:
10 20 30 40 50
4. fprintf와 fscanf 사용 시 주의점
- 파일 포인터 검사:
fopen()
의 반환값이NULL
인지 확인해야 합니다. 파일이 존재하지 않거나 접근 권한이 없을 경우 프로그램이 예상치 못한 동작을 할 수 있습니다. - 버퍼링 문제:
fprintf
를 사용한 후fclose
또는fflush
를 호출하여 데이터가 실제로 기록되었는지 확인해야 합니다. - fscanf의 입력 형식:
fscanf
를 사용할 때 입력 형식이 잘못되면 예상과 다른 결과가 나올 수 있으므로 주의해야 합니다. - 데이터 오버플로우 방지: 문자열을 입력받을 경우
fscanf(file, "%19s", name);
처럼 버퍼 크기를 제한하는 것이 좋습니다.
5. 마무리
fprintf
와 fscanf
는 파일 입출력에서 매우 유용한 함수입니다. fprintf
를 사용하면 포맷팅된 데이터를 손쉽게 파일에 기록할 수 있으며, fscanf
를 이용하면 원하는 형식으로 데이터를 읽을 수 있습니다. 이번 포스팅에서 다룬 예제를 직접 실행해보면서 C 언어의 파일 입출력 기능을 익혀보세요!
'c 언어 > c 표준 라이브러리(Standard C Library)' 카테고리의 다른 글
C 언어 표준 API - stdio.h의 파일 입출력 (fopen, fclose, fread, fwrite) (0) | 2025.02.05 |
---|---|
C 언어 표준 입출력 - `fputs`와 `fgets` 사용법 (0) | 2025.02.04 |
C 표준 입출력 - `puts`와 `gets` (0) | 2025.02.03 |
stdio.h 개요 및 기본 입출력 함수 `printf`, `scanf` (0) | 2025.02.02 |
C 언어 표준 라이브러리 개요 (0) | 2025.02.02 |