파일 입출력
파일 입출력이란?
파일 입출력은 C 언어에서 프로그램이 외부 파일에 데이터를 저장하거나 외부 파일로부터 데이터를 읽어오는 기능을 의미합니다. 이 기능은 데이터를 영구적으로 저장하거나 프로그램 간 데이터 교환을 할 때 매우 유용합니다. 텍스트 파일은 사람이 읽을 수 있는 형태로 데이터를 저장하고, 바이너리 파일은 메모리 그대로 저장하여 구조체 같은 복잡한 자료를 효율적으로 저장할 수 있습니다.
파일 열기와 닫기 - fopen(), fclose()
파일 입출력을 하려면 먼저 파일을 열어야 합니다. C에서는 fopen() 함수를 사용하여 파일을 열고, 사용이 끝난 후에는 fclose()로 반드시 닫아줘야 합니다. 다음은 기본적인 사용 예제입니다:
FILE *fp;
fp = fopen("data.txt", "r"); // 읽기 모드
if (fp == NULL) {
printf("파일을 열 수 없습니다.\n");
return 1;
}
fclose(fp);
텍스트 파일 읽기/쓰기
fprintf, fscanf
fprintf() 함수는 파일에 데이터를 형식에 맞게 출력할 때 사용하고, fscanf() 함수는 파일에서 형식에 맞게 데이터를 읽어올 때 사용됩니다.
FILE *fp = fopen("sample.txt", "w");
if (fp != NULL) {
fprintf(fp, "이름: %s, 나이: %d\n", "홍길동", 25);
fclose(fp);
}
FILE *fp = fopen("sample.txt", "r");
char name[20];
int age;
if (fp != NULL) {
fscanf(fp, "이름: %s, 나이: %d", name, &age);
printf("읽은 데이터: %s %d\n", name, age);
fclose(fp);
}
fgets (줄 단위 읽기)
fgets() 함수는 한 줄씩 텍스트 파일을 읽어올 때 사용합니다. 보통 로그 파일이나 줄 단위로 구성된 데이터를 읽을 때 유용합니다.
char buffer[100];
FILE *fp = fopen("sample.txt", "r");
if (fp != NULL) {
while (fgets(buffer, 100, fp) != NULL) {
printf("%s", buffer);
}
fclose(fp);
}
바이너리 파일 처리
바이너리 파일은 데이터를 메모리 구조 그대로 저장하므로, 구조체나 배열 데이터를 파일에 저장할 때 많이 사용됩니다. fwrite()와 fread() 함수를 사용합니다.
typedef struct {
char name[20];
int age;
} Person;
FILE *fp = fopen("person.dat", "wb");
Person p = {"김철수", 30};
fwrite(&p, sizeof(Person), 1, fp);
fclose(fp);
fp = fopen("person.dat", "rb");
Person p2;
fread(&p2, sizeof(Person), 1, fp);
printf("이름: %s, 나이: %d\n", p2.name, p2.age);
fclose(fp);
파일 오류 처리
파일 입출력 작업 중에는 다양한 오류가 발생할 수 있습니다. 파일이 존재하지 않거나 권한이 없을 경우 fopen()은 NULL을 반환하므로 반드시 체크해야 합니다. perror() 함수는 오류 메시지를 출력하는 데 유용합니다.
FILE *fp = fopen("없는파일.txt", "r");
if (fp == NULL) {
perror("파일 열기 실패");
}
파일 모드 요약
파일을 열 때 사용하는 모드는 다음과 같습니다:
"r": 읽기 전용. 파일이 없으면 NULL 반환"w": 쓰기 전용. 파일이 없으면 생성, 있으면 내용 삭제"a": 추가 전용. 파일 끝에 데이터를 추가"rb","wb","ab": 바이너리 모드 읽기/쓰기/추가
파일 입출력은 다양한 응용 프로그램에서 핵심적인 역할을 하며, 데이터를 보존하거나 분석하는 데 반드시 필요한 기능입니다. C 언어의 파일 입출력 함수들을 잘 활용하면 프로그램의 기능을 크게 확장할 수 있습니다.
'Programming' 카테고리의 다른 글
| C 전처리기 (47) | 2025.08.19 |
|---|---|
| C 구조체와 공용체 (60) | 2025.08.18 |
| C 포인터 기초 (63) | 2025.08.16 |
| C 배열과 문자열 (36) | 2025.08.15 |
| C 함수 (63) | 2025.08.14 |