기본 콘텐츠로 건너뛰기

방송대 방통대 C프로그래밍 13강 - 파일처리 함수 - 요약 노트 시험족보 예상문제 - 올에이클래스

C프로그래밍 13강 - 파일처리 함수

C프로그래밍 13강 - 파일처리 함수

파일과 버퍼, 입출력 스트림의 개념을 이해하고 파일을 열어 자료를 처리한 뒤 닫는 기본 절차를 익힌다. 텍스트 순차파일과 이진 랜덤파일의 차이, 주요 입출력 함수 및 fseek를 이용한 위치 이동 방법을 체계적으로 정리한다.

1. 파일·버퍼·스트림의 개념

파일(file)은 하드디스크, SSD, USB 메모리와 같은 대용량 비휘발성 보조기억장치에 저장된 자료의 모임이다. C 언어에서는 컴퓨터에 연결된 입력·출력 장치도 파일의 범주에 넣어 처리한다.

버퍼(buffer)는 효율적인 입출력을 위해 자료 공급장치와 소비장치 사이에 두는 기억공간이다. 프로그램과 파일이 매번 작은 자료를 직접 주고받는 대신 버퍼에 자료를 모아 전달하여 입출력을 효율적으로 처리한다.

입출력 스트림(stream)은 프로그램과 파일·콘솔 같은 외부 장치 사이에서 데이터를 전달하는 논리적인 통로이다. scanf와 printf가 사용하는 표준 스트림은 프로그램 실행 시 자동 생성되고 종료 시 자동 소멸한다. 파일용 스트림은 프로그램에서 함수를 호출해 생성하고 소멸시킨다.

분류 기준종류특징
저장 형태텍스트 파일자료를 문자 형태로 저장
저장 형태이진 파일자료의 2진수 표현을 그대로 저장
접근 방식순차파일처음부터 차례로 기록·판독
접근 방식랜덤파일임의 위치에서 기록·판독

2. 파일 입출력 절차와 FILE 포인터

C의 파일 입출력은 다음 세 단계로 진행한다.

  1. 파일 열기: fopen()으로 파일과 자료를 주고받을 스트림을 생성한다.
  2. 입출력 수행: fscanf(), fprintf(), fread(), fwrite() 등의 함수를 사용한다.
  3. 파일 닫기: fclose()로 스트림을 소멸시키고 시스템 자원을 해제한다.

fopen()은 파일을 열어 스트림을 생성하고 그 스트림을 나타내는 파일 포인터를 반환한다. FILE은 파일 관련 정보를 저장하는 구조체이다.

FILE *fp;
fp = fopen("test.dat", "r");

if (fp == NULL) {
    /* 파일 개방 실패 처리 */
}

fclose(fp);

fclose()는 버퍼에 남은 출력 자료를 파일에 저장한 뒤 파일 관련 시스템 자원을 해제한다. 파일 사용을 마치면 반드시 닫는 절차를 수행한다.

fopen()의 결과가 NULL이면 파일 개방에 실패한 것이다. 성공한 파일 포인터로 입출력을 수행하고 마지막에 fclose()를 호출한다.

3. fopen 사용 모드

fopen("파일명", "사용모드")의 사용 모드는 파일 접근 방법과 자료 입출력 형태를 나타낸다. r은 읽기, w는 쓰기, a는 추가이며, +는 읽기와 쓰기를 함께 허용하고 b는 이진 모드를 뜻한다.

사용 모드기능파일이 있을 때파일이 없을 때
r, rb읽기정상 개방NULL 반환
r+, rb+읽기·쓰기정상 개방NULL 반환
w, wb쓰기이전 내용 삭제새 파일 생성
w+, wb+읽기·쓰기이전 내용 삭제새 파일 생성
a, ab추가기존 내용 뒤에 추가새 파일 생성
a+, ab+읽기·쓰기·추가기존 내용 뒤에 추가새 파일 생성

w 계열은 기존 파일을 열 때 이전 내용을 삭제하지만 a 계열은 기존 내용 뒤에 자료를 붙인다. r 계열은 파일이 없으면 새로 만들지 않고 NULL을 반환한다.

4. 주요 파일처리 함수

함수기능
fgetc(), getc()파일에서 한 문자 읽기
fputc(), putc()파일에 한 문자 쓰기
fgets()파일에서 문자열 읽기
fputs()파일에 문자열 쓰기
fscanf()지정된 형식으로 파일에서 자료 읽기
fprintf()지정된 형식으로 파일에 자료 쓰기
fread(), fwrite()지정된 크기와 개수의 자료 읽기·쓰기
fseek()파일 입출력 위치 이동
feof()파일 끝인지 판별
ferror()파일 입출력 오류 발생 여부 검사
FILE *fp = fopen("sample.txt", "w");
for (char ch = 'A'; ch <= 'Z'; ch++)
    fputc(ch, fp);
fclose(fp);

이 프로그램은 쓰기 모드로 sample.txt를 열고 A부터 Z까지 한 문자씩 기록한 다음 파일을 닫는다.

5. 텍스트 순차파일의 처리

텍스트 파일은 자료를 문자 형태로 저장한다. 레코드 길이가 일정하지 않으며 개행문자 '\n'로 레코드를 구분한다. 개행문자가 실제 파일에 저장되는 형태는 운영체제에 따라 CR/LF 또는 LF가 될 수 있다.

구분함수 형식기능
문자 출력putc(ch, fp), fputc(ch, fp)문자 한 개 쓰기
문자열 출력fputs(str, fp)문자열 쓰기
형식 출력fprintf(fp, "형식", ...)지정 형식으로 쓰기
문자 입력getc(fp), fgetc(fp)문자 한 개 읽기
문자열 입력fgets(str, 길이+1, fp)최대 길이만큼 행 읽기
형식 입력fscanf(fp, "형식", ...)지정 형식으로 읽기

fgets()는 지정한 최대 길이 안에서 행의 끝까지 읽으며 개행문자도 포함하여 입력한다. 순차파일은 저장한 순서에 따라 앞에서부터 자료를 읽고 처리한다.

6. 표준 파일과 텍스트 처리 예

C는 키보드와 모니터 같은 입출력 장치도 파일 개념으로 처리한다. 표준 파일 포인터는 프로그램 시작 시 자동 생성되므로 별도로 선언할 필요가 없다.

표준 파일파일 포인터대응 장치
표준 입력stdin키보드
표준 출력stdout모니터
표준 에러stderr모니터
FILE *fp = fopen("sample3.txt", "w");
if (fp == NULL) {
    fprintf(stderr, "파일을 개방할 수 없습니다.");
    exit(1);
}

fprintf(stdout, "학번 이름 중간 기말 리포트 출석 점수 입력\n");
fscanf(stdin, "%s %s %d %d %d %d",
       no, name, &mid, &term, &rep, &att);
fprintf(fp, "%-10s %-8s %3d %3d %3d %3d\n",
        no, name, mid, term, rep, att);
fclose(fp);

키보드 입력은 stdin에서 형식에 맞춰 읽고, 안내와 오류는 stdout과 stderr로 출력하며, 학생 자료는 파일 포인터 fp가 가리키는 텍스트 파일에 기록한다.

7. 랜덤파일과 이진 입출력

랜덤파일(random file)은 파일의 임의 위치에서 자료를 읽거나 쓸 수 있는 파일이다. 레코드 길이가 일정하므로 특정 레코드 위치를 계산해 직접 접근할 수 있고, 불필요한 앞부분을 모두 읽지 않아도 되어 고속 접근에 유용하다.

랜덤파일은 일반적으로 wb 또는 rb 같은 이진 모드로 개방한다. 이진 모드는 메모리에 표현된 원시 자료를 그대로 저장하므로 수치형 자료를 텍스트로 변환할 필요가 없어 빠르다. 다만 사람이 내용을 읽기 어렵고 시스템 간 호환성에 주의해야 한다.

int buf[16];
fwrite(buf, sizeof(int), 16, fp);
fread(buf, sizeof(int), 16, fp);

fwrite(자료버퍼, 레코드길이, 레코드개수, 파일포인터)는 자료를 쓰고 fread()는 같은 형식으로 읽는다. 처리되는 전체 자료량은 레코드길이×레코드개수이다.

랜덤 접근을 하려면 레코드 길이가 일정하고 원하는 자료의 위치를 계산할 수 있어야 한다.

8. fseek를 이용한 위치 이동

fseek()는 파일의 입출력 위치를 임의 위치로 이동하여 특정 레코드를 직접 읽거나 쓸 수 있게 한다.

fseek(파일포인터, 이동할_상대위치, 기준위치_모드);
기호기준 위치
SEEK_SET파일 시작 위치
SEEK_CUR파일 포인터의 현재 위치
SEEK_END파일 끝 위치
fseek(fp, 2 * REC_SIZE, SEEK_SET);  /* 시작에서 레코드 2개 뒤 */
fseek(fp, -2 * REC_SIZE, SEEK_CUR); /* 현재에서 레코드 2개 앞 */
fseek(fp, 3 * REC_SIZE, SEEK_CUR);  /* 현재에서 레코드 3개 뒤 */

강의의 고정 길이 10바이트 이름 파일에서는 fseek(fp, 10*3, SEEK_SET)으로 네 번째 레코드 CHOI DS를 읽는다. 그 뒤 한 레코드를 읽어 현재 위치가 다음 레코드 뒤로 이동한 상태에서 fseek(fp, -2*10, SEEK_CUR)을 수행하면 두 레코드 앞의 LEE SY를 읽게 된다.

핵심 개념 정리

  • 파일은 비휘발성 보조기억장치에 저장된 자료의 모임이며 입출력 효율을 위해 버퍼를 사용한다.
  • 프로그램과 외부 장치 사이의 논리적 데이터 통로를 스트림이라 한다.
  • 파일은 fopen()으로 열고 입출력한 뒤 fclose()로 닫는다.
  • r 계열은 없는 파일을 만들지 않고, w 계열은 기존 내용을 지우며, a 계열은 기존 내용 뒤에 추가한다.
  • 텍스트 순차파일은 문자 형태의 가변 길이 레코드를 저장 순서대로 처리한다.
  • stdin, stdout, stderr는 프로그램 시작 시 자동 생성되는 표준 파일 포인터이다.
  • 이진 랜덤파일은 일정 길이 레코드를 원시 형태로 저장하고 특정 위치를 직접 처리한다.
  • fseek()는 SEEK_SET, SEEK_CUR, SEEK_END 기준으로 파일 위치를 이동한다.

최종 정리: 파일 프로그램은 모드에 맞게 열고, 성공 여부를 확인한 뒤, 적절한 함수로 입출력하고 반드시 닫는 흐름으로 작성한다. 순차파일은 저장 순서를 따르며 랜덤파일은 고정 레코드 크기와 fseek를 이용해 원하는 위치에 직접 접근한다.

예상문제 20선

1. 파일의 정의로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
파일은 하드디스크나 SSD 같은 비휘발성 보조기억장치에 저장된 자료의 모임이다.

2. 버퍼의 역할은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
버퍼는 자료를 임시로 모아 장치와 프로그램 사이의 입출력을 효율화한다.

3. 프로그램과 외부 장치 사이의 논리적 데이터 통로는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
입출력 스트림은 프로그램과 파일·콘솔 사이에서 데이터를 전달한다.

4. 파일 처리의 올바른 순서는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
fopen으로 스트림을 생성하고 자료를 처리한 뒤 fclose로 닫는다.

5. fopen이 파일을 정상적으로 열지 못했을 때 반환하는 값은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
파일 개방 실패 여부는 반환된 파일 포인터가 NULL인지 검사한다.

6. fclose(fp)의 기능은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
fclose는 남은 출력 자료를 저장하고 연결된 파일 스트림을 제거한다.

7. 기존 파일을 w 모드로 열면?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
w 계열은 기존 파일의 이전 내용을 지우고 쓰기용으로 개방한다.

8. 기존 내용 뒤에 자료를 추가하는 모드는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
a 계열은 파일이 있으면 기존 내용 끝에 새 자료를 추가한다.

9. 파일에 문자열을 쓰는 함수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
fputs는 문자열을 지정한 파일 스트림에 출력한다.

10. 지정된 형식에 따라 파일에서 자료를 읽는 함수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
fscanf는 파일 포인터와 입력 형식을 받아 자료를 읽는다.

11. fgets(str, 길이+1, fp)에 대한 설명은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
fgets는 지정된 크기를 넘지 않게 문자열을 읽고 행 끝의 개행문자도 포함한다.

12. 표준 에러 파일 포인터는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
stderr는 모니터에 대응되는 표준 에러 스트림이다.

13. 랜덤파일의 특징은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
랜덤파일은 원하는 레코드의 위치를 계산해 직접 접근한다.

14. 이진 모드의 특징으로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
수치형 자료를 텍스트로 변환하지 않고 원시 표현 그대로 저장한다.

15. fwrite(buf, sizeof(int), 16, fp)가 쓰는 자료량은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
전체 자료량은 한 레코드 길이와 레코드 개수의 곱이다.

16. 파일의 입출력 위치를 이동하는 함수는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
fseek는 기준 위치와 상대 이동량을 사용해 파일 위치를 바꾼다.

17. SEEK_SET의 기준은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ①
SEEK_SET은 파일의 맨 앞을 기준 위치로 사용한다.

18. SEEK_CUR의 기준은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ②
SEEK_CUR은 현재 입출력 위치에서 앞이나 뒤로 상대 이동할 때 사용한다.

19. fseek(fp, -2*REC_SIZE, SEEK_CUR)의 의미는?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ③
음수 이동량과 SEEK_CUR 조합은 현재 위치를 기준으로 앞쪽으로 이동한다.

20. 순차파일과 랜덤파일의 비교로 옳은 것은?

정답입니다.

오답입니다. 답안을 다시 선택해 보세요.

정답 및 해설 보기

정답: ④
순차파일은 앞에서부터 처리하고 랜덤파일은 계산한 레코드 위치를 직접 처리한다.

댓글