12장 파일 입출력 완벽 정리 - C언어 파일 스트림과 파일 처리 기초
컴퓨터 프로그래밍에서 파일 입출력(File I/O)은 데이터를 영구적으로 저장하고 불러오는 필수적인 기능입니다. 특히 C언어에서는 스트림(stream)
개념을 이용하여 입출력 장치에 관계없이 데이터를 바이트 단위로 연속적으로 처리합니다. 이번 글에서는 C언어의 파일 입출력 원리부터 함수, 그리고 임의 접근 파일 처리 방법까지 꼼꼼히 정리합니다.
1. 스트림(Stream)이란?
스트림은 데이터를 연속적인 바이트 흐름으로 바라보는 개념입니다. 예를 들어 키보드, 모니터, 파일 등 어떤 장치든 데이터는 바이트 단위로 흘러 들어가고 나옵니다. 스트림의 가장 큰 장점은 장치 독립성에 있습니다. 즉, 데이터가 어디서 왔고 어디로 가는지 신경 쓰지 않아도 동일한 방식으로 입출력을 처리할 수 있습니다.
주요 표준 스트림:
stdin
: 표준 입력 스트림 (보통 키보드)stdout
: 표준 출력 스트림 (보통 모니터)stderr
: 표준 오류 스트림 (오류 메시지 출력)
2. C에서 파일의 이해
C언어에서 파일은 연속된 바이트의 집합으로 취급되며 크게 두 종류로 나뉩니다.
- 텍스트 파일 : 사람이 읽을 수 있도록 아스키 문자로 저장된 파일입니다. 운영체제마다 줄 바꿈(CR, LF, CRLF)의 방식이 다를 수 있습니다.
- 이진 파일(Binary file) : 데이터가 컴퓨터가 직접 이해하는 2진수 형태로 저장된 파일로, 텍스트로 변환되지 않습니다. 특정 프로그램만 해석할 수 있습니다.
3. 파일 처리 기본 흐름
C언어에서 파일 처리는 파일 열기 → 읽기/쓰기 → 파일 닫기의 과정을 반드시 거쳐야 합니다. 파일을 다루기 위해서는 <stdio.h>
헤더의 FILE
구조체와 관련 함수를 사용합니다.
FILE* fp;
fp = fopen("filename.txt", "r"); // 파일 열기
// 파일 읽기 또는 쓰기 작업
fclose(fp); // 파일 닫기
파일 열기 모드
"r"
: 읽기 모드 (파일이 없으면 오류)"w"
: 쓰기 모드 (기존 파일이 있으면 내용 삭제 후 새로 작성)"a"
: 추가 모드 (파일 끝에 데이터 추가, 없으면 새 파일 생성)"r+"
: 읽기/쓰기 모드 (파일 존재해야 함)"w+"
: 읽기/쓰기 모드 (기존 내용 삭제)"a+"
: 읽기/추가 모드
일반적으로 +
가 붙은 모드는 읽기와 쓰기를 동시에 지원하는 수정 모드입니다.
4. 문자 단위 파일 입출력
파일에 문자 하나씩 읽거나 쓸 때 사용하는 함수입니다.
int fgetc(FILE *fp);
: 파일에서 한 문자 읽기int fputc(int c, FILE *fp);
: 파일에 한 문자 쓰기
5. 문자열 단위 입출력
한 줄씩 문자열을 읽거나 쓸 때 씁니다.
char *fgets(char *s, int n, FILE *fp);
: 최대 n-1개 문자 읽고 문자열 끝에 '\0' 추가int fputs(const char *s, FILE *fp);
: 문자열을 파일에 쓰기 (개행 문자 포함 X)
6. 형식화된 입출력
숫자, 문자열 등 데이터를 형식에 맞게 읽고 쓸 때 사용합니다.
int fprintf(FILE *fp, const char *format,...);
: 출력 함수, 숫자 등 데이터를 문자열로 변환하여 파일에 저장int fscanf(FILE *fp, const char *format,...);
: 입력 함수, 파일에서 문자열을 읽어 데이터로 변환
예시:
int num;
fprintf(fp, "%d\n", num); // num을 문자열로 변환해 저장
fscanf(fp, "%d", &num); // 파일에서 정수 읽어 num에 저장
7. 이진 파일 입출력
이진 파일은 데이터가 텍스트가 아니라 컴퓨터 내부 표현 방식 그대로 저장됩니다. 파일을 이진 모드로 열고, 메모리 버퍼 단위로 읽고 씁니다.
FILE *fp = fopen("data.bin", "rb");
: 이진 읽기FILE *fp = fopen("data.bin", "wb");
: 이진 쓰기
읽기/쓰기 함수:
size_t fread(void *ptr, size_t size, size_t count, FILE *fp);
: 버퍼에 size크기 데이터 count개 읽기size_t fwrite(const void *ptr, size_t size, size_t count, FILE *fp);
: 버퍼의 데이터를 파일에 size크기 count개 쓰기
예시 - 정수 배열을 이진파일에 저장:
int buffer[10] = {1,2,3,4,5,6,7,8,9,10};
FILE *fp = fopen("binary.bin", "wb");
fwrite(buffer, sizeof(int), 10, fp);
fclose(fp);
8. 임의 접근 파일(Random Access)
임의 접근은 파일의 원하는 위치로 바로 이동하여 읽거나 쓸 수 있는 기능입니다. 이는 대용량 파일에서 특정 부분만 수정하거나 읽을 때 매우 유용합니다.
int fseek(FILE *fp, long offset, int origin);
-origin
은 기준점으로 다음 중 하나를 씁니다.
•SEEK_SET
(0): 파일 시작 위치
•SEEK_CUR
(1): 현재 위치
•SEEK_END
(2): 파일 끝void rewind(FILE *fp);
: 파일 포인터를 파일 처음으로 이동long ftell(FILE *fp);
: 현재 파일 포인터 위치 반환
9. 마무리 정리
fclose(fp);
로 파일을 닫아야 데이터 손실과 자원 누수를 방지할 수 있습니다.또한, 텍스트 파일과 이진 파일은 처리 방식과 저장 포맷이 다르니 목적에 맞게 적절한 모드를 선택하세요.
파일 임의 접근 기능을 활용하면 필요한 위치에 효율적으로 데이터 입출력이 가능합니다.
이번 12장은 파일 입출력에 관한 기초부터 심화까지 다양한 내용을 다뤘습니다. 이 개념들은 시스템 프로그래밍, 데이터 처리, 게임 개발 등 거의 모든 분야에서 중요하게 사용되니 반드시 숙지하시길 바랍니다!
'과목공부 > C언어' 카테고리의 다른 글
[C언어] 동적 메모리 할당 완벽 정리 | C 프로그래밍 (1) | 2025.06.14 |
---|---|
[C언어] C언어 구조체, 공용체, 열거형 - C언어 핵심 개념 정리 (0) | 2025.06.14 |
[C언어] C언어 문자열 완벽 정리: NULL 문자부터 문자열 함수, 입출력까지 (0) | 2025.06.14 |
[C언어] C언어 포인터 완전 정복: 함수 포인터와 다양한 포인터 활용법 (0) | 2025.06.14 |
[C언어] C언어 포인터 완벽 정리와 핵심 개념 (0) | 2025.06.14 |