안녕하세요! 오늘은 C언어의 파일 입출력에 대해 알아보도록 하겠습니다. 프로그램을 작성할 때 데이터를 저장하고 불러오는 방법은 매우 중요합니다. 특히, 파일 입출력은 프로그램이 종료된 후에도 데이터를 유지할 수 있게 해 주므로, 이를 활용하면 유용한 애플리케이션을 개발할 수 있습니다. 이제 C언어에서 파일 입출력을 어떻게 구현하는지 살펴보겠습니다.

파일 입출력이란?
파일 입출력은 데이터를 저장하는 방법 중 하나로, 컴퓨터의 저장소에 있는 파일을 읽거나 수정, 새로 만드는 작업을 포함합니다. 프로그램이 메모리에서 처리하는 데이터는 프로그램이 종료되면 사라지므로, 이를 영구적으로 저장하고 싶다면 파일에 데이터를 저장해야 합니다. 파일은 일반적으로 하드디스크와 같은 외부 저장소에 위치하며, 데이터는 파일을 통해 관리됩니다.
파일과 스트림의 개념
파일은 데이터를 저장할 수 있는 공간으로, C언어에서는 파일과 프로그램 간의 데이터 전송을 위해 스트림을 사용합니다. 스트림은 파일과 프로그램 간의 데이터 흐름을 관리하는 통로로, 이를 통해 데이터를 읽고 쓸 수 있습니다.
- 파일(file): 프로그램이 읽고 쓸 수 있는 데이터 저장소입니다.
- 스트림(stream): 데이터를 주고받는 통로 역할을 합니다.
파일 입출력의 기본 흐름
파일 입출력을 수행하기 위해서는 다음과 같은 기본적인 단계가 필요합니다.
- 파일 열기: 파일을 사용하기 위해 먼저 열어야 하며, 이를 위해
fopen
함수를 사용합니다. - 파일 사용하기: 열린 파일을 통해 데이터를 읽거나 씁니다.
- 파일 닫기: 작업이 끝난 후
fclose
함수를 사용해 파일을 닫습니다.
파일 열기 및 닫기
파일 열기
파일을 열기 위해서는 fopen
함수를 사용합니다. 이 함수의 기본 구조는 다음과 같습니다:
FILE *fopen(const char *filename, const char *mode);
여기서 filename
은 열고자 하는 파일의 이름을, mode
는 파일의 사용 목적을 나타내는 문자열입니다. 사용 가능한 모드는 다음과 같습니다:
r
: 읽기 전용으로 파일을 열기 (파일이 존재해야 함)w
: 쓰기 전용으로 파일을 열기 (파일이 없다면 생성, 기존 내용은 삭제됨)a
: 추가 전용으로 파일을 열기 (파일이 없다면 생성, 기존 내용 뒤에 추가됨)r+
: 읽기 및 쓰기 가능w+
: 쓰기 및 읽기 가능 (기존 내용 삭제)a+
: 추가 및 읽기 가능
파일 닫기
파일을 닫기 위해서는 fclose
함수를 사용합니다. 이 함수는 메모리 누수를 방지하고, 파일을 안전하게 저장하는 데 중요합니다. 기본 구조는 다음과 같습니다:
int fclose(FILE *stream);
성공적으로 닫으면 0을 반환하고, 문제가 발생할 경우 EOF를 반환합니다.
파일 읽기 및 쓰기
파일에서 데이터를 읽거나 쓰기 위해서는 여러 가지 함수가 존재합니다. 가장 기본적인 입출력 함수는 다음과 같습니다:
fgetc
: 한 문자를 읽어오는 함수fputc
: 한 문자를 쓰는 함수fgets
: 문자열을 읽어오는 함수fputs
: 문자열을 쓰는 함수fprintf
: 서식에 맞춰 데이터를 파일에 쓰는 함수fscanf
: 서식에 맞춰 파일에서 데이터를 읽는 함수
파일 쓰기 예제
아래는 파일에 데이터를 쓰는 예제입니다. “example.txt”라는 파일에 텍스트를 작성하는 코드입니다:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "w");
if (file == NULL) {
perror("파일 열기 실패");
return 1;
}
fprintf(file, "안녕하세요!\n");
fprintf(file, "C 언어의 파일 처리를 배우고 있습니다.\n");
fclose(file);
printf("파일에 데이터 쓰기 완료\n");
return 0;
}
파일 읽기 예제
파일에서 데이터를 읽는 예제는 다음과 같습니다. “example.txt” 파일에서 내용을 읽어오는 코드입니다:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("파일 열기 실패");
return 1;
}
char buffer[256];
while (fgets(buffer, sizeof(buffer), file) != NULL) {
printf("%s", buffer);
}
fclose(file);
return 0;
}
바이너리 파일 입출력
텍스트 파일 외에도 바이너리 파일을 처리할 수 있습니다. 바이너리 파일은 이미지나 오디오 데이터와 같은 비텍스트 데이터를 저장하는 데 사용됩니다. 바이너리 파일을 다루기 위해서는 fwrite
와 fread
함수를 사용합니다.

바이너리 파일 쓰기 예제
다음은 정수 배열을 바이너리 파일로 저장하는 예제입니다:
#include <stdio.h>
int main() {
FILE *file = fopen("data.bin", "wb");
if (file == NULL) {
perror("파일 열기 실패");
return 1;
}
int numbers[] = {1, 2, 3, 4, 5};
fwrite(numbers, sizeof(int), 5, file);
fclose(file);
printf("바이너리 파일에 데이터 쓰기 완료\n");
return 0;
}
바이너리 파일 읽기 예제
아래는 바이너리 파일에서 데이터를 읽는 예제입니다:
#include <stdio.h>
int main() {
FILE *file = fopen("data.bin", "rb");
if (file == NULL) {
perror("파일 열기 실패");
return 1;
}
int numbers[5];
fread(numbers, sizeof(int), 5, file);
for (int i = 0; i < 5; i++) {
printf("%d ", numbers[i]);
}
printf("\n");
fclose(file);
return 0;
}
파일 포인터와 위치 관리
파일 포인터를 이용하면 파일 내에서 현재 위치를 관리할 수 있습니다. 파일 포인터를 이동시키기 위해서는 fseek
, ftell
, rewind
함수를 사용할 수 있습니다.
fseek:
파일 포인터를 특정 위치로 이동시킵니다.ftell:
현재 파일 포인터의 위치를 반환합니다.rewind:
파일 포인터를 맨 처음으로 이동시킵니다.
파일 포인터 사용 예제
아래는 파일 크기를 확인하고 파일 포인터를 처음으로 되돌리는 코드입니다:
#include <stdio.h>
int main() {
FILE *file = fopen("example.txt", "r");
if (file == NULL) {
perror("파일 열기 실패");
return 1;
}
fseek(file, 0, SEEK_END);
long file_size = ftell(file);
rewind(file);
printf("파일 크기: %ld 바이트\n", file_size);
fclose(file);
return 0;
}

결론
C언어의 파일 입출력은 데이터를 저장하고 불러오는 데 매우 유용한 기능입니다. 텍스트 파일과 바이너리 파일을 통해 다양한 형식의 데이터를 처리할 수 있으며, 파일 포인터를 활용하여 파일의 위치를 효과적으로 관리할 수 있습니다. 이번 포스팅에서 소개한 내용을 바탕으로 실습을 통해 더욱 깊이 있는 이해를 쌓아보시기를 바랍니다.
질문 FAQ
C언어에서 파일 입출력이란 무엇인가요?
C언어의 파일 입출력은 프로그램이 외부의 파일과 데이터를 주고받는 과정을 의미합니다. 이를 통해 프로그램이 종료된 후에도 데이터를 보존할 수 있습니다.
파일을 어떻게 열고 닫나요?
파일을 열기 위해서는 fopen
함수를 사용하고, 작업이 끝난 후에는 fclose
를 통해 파일을 안전하게 닫아야 합니다.
파일에서 데이터를 읽고 쓰는 방법은?
파일에 데이터를 쓰거나 읽기 위해서는 fprintf
, fscanf
와 같은 다양한 함수를 활용할 수 있습니다. 이들 함수를 통해 원하는 형식으로 데이터를 처리할 수 있습니다.