[ 단원 12 ] 파일처리 부산대학교 남 태 우
학습목표
파일의 필요성 보조기억장치인 디스크에 저장되는 파일(file) 직접 삭제하지 않은 한 프로그램이 종료되더라도 계속 저장 가능
텍스트 파일과 이진 파일 텍스트 파일 문자 기반의 파일로서 내용이 아스키코드(ascii code)와 같은 문자 코드값으로 저장 이진 파일 그림 파일, 동영상 파일, 실행 파일과 같이 각각의 목적에 알맞은 자료가 이진 형태(binary format)로 저장
파일 스트림 이해 파일 스트림 파일과 프로그램 간의 정보가 입력 또는 출력되는 연결 통로 종류 입력을 위한 파일 입력 스트림(file input stream) 출력을 위한 파일 출력 스트림(file output stream)
파일 처리 관련 구조체 구조체 자료형 FILE 헤더 파일 stdio.h에 정의되어 있는 구조체 유형 구조체 FILE은 파일을 표현하는 C 언어의 유도 자료형 struct _iobuf { char *_ptr; int _cnt; char *_base; int _flag; int _file; int _charbuf; int _bufsiz; char *_tmpfname; }; typedef struct _iobuf FILE;
파일 스트림 열기 함수 fopen() 또는 fopen_s() 프로그램에서 특정한 파일과 파일 스트림을 연결하는 함수 _File
파일 처리 모드 모드 6가지: “r”, “w”, “a”, “r+“, “w+”, “a+” 파일 모드에서 +의 삽입은 수정(update) 모드 의미 원래의 모드에서 읽기 또는 쓰기가 추가되는 모드
파일 처리 모드 전환(mode switch) 수정(update) 모드 + 수정 모드에서 모드 전환은 추가 모드와 읽기 모드간의 전환과 쓰기 모드와 읽기 모드간의 전환이 가능 모드 전환 사이에는 fflush()와 fseek() 또는 rewind()와 같은 함수 호출이 반드시 필요 파일 모드 r+ 처음에 읽기 모드로 파일을 열어 필요하면 쓰기 모드로 전환 만일 파일이 없으면 오류가 발생 파일 모드 w+ 처음에 쓰기 모드로 파일을 열어 필요하면 읽기 모드로 전환 만일 파일이 존재한다면 이전의 내용은 모두 사라짐 파일 모드 a+ 처음에 추가 모드로 파일을 열어 필요하면 읽기 모드로 전환
출력 스트림을 이용한 파일 생성 파일 스트림 닫기 fopen.c 함수 fclose()는 fopen()으로 연결한 파일 스트림을 닫는 기능을 수행 fopen.c 학생 이름과 점수를 파일“basic.txt”에 출력하는 프로그램 함수 exit() 함수를 강제로 종료 함수 exit()를 이용하려면 헤더 파일 stdlib.h 필요
파일에 서식화된 문자열 입출력 함수 fprintf()와 fscanf() 텍스트 파일에 자료를 쓰거나 읽기 위한 함수 헤더 파일 stdio.h 필요
파일 쓰기와 읽기 fprintf.c 쓰기 모드로 파일을 열어 표준입력으로 받은 학생 이름과 중간점수, 기말점수를 파일에 기록하고 파일을 닫음 파일 grade.txt 생성 다시 읽기 모드로 그 파일을 열어 기록된 내용을 읽어와 표준출력으로 출력하는 프로그램
파일 문자열 입출력 함수 fgets() 함수 fputs() 파일로부터 한 행의 문자열을 입력받는 함수 파일로 한 행의 문자열을 출력하는 함수
함수 fgets()와 fputs()를 이용 multilineio.c 표준입력으로 여러 줄을 입력 받아 파일 grade.txt에 출력하는 프로그램 여러 줄의 표준입력을 처리하기 위하여 while ( !feof(stdin) ) {…} 구문을 이용 함수 fputs()를 이용하기 전에 함수 fprintf()를 이용하여 줄 번호를 출력 즉 파일 grade. txt 저장 시 맨 앞에 1부터 순차적으로 번호가 삽입 표준입력에서 입력을 종료하려면 파일의 끝(EOF)을 의미하는 키 ctrl + Z를 새로운 행의 처음에 누르도록
파일 문자 입출력 함수 fgetc()와 fputc() 함수 fgetc()는 파일로부터 문자 하나를 입력받는 함수
파일 문자 입출력 이용 fgetc.c 여러 문자를 표준입력으로 받아 파일 char.txt에 저장한 후, 다시 파일에서 문자를 읽어 표준출력하는 프로그램 표준입력에서 문자 x를 입력하면 입력 절차가 종료 콘솔의 표준 입출력으로 함수 _getche()와 _putch()를 이용 함수 _getche()와 _putch()는 visual C++에서 getche()와 putch()를 대체하는 권장함수 실행 후 프로젝트 폴더에 파일 char.txt가 생성되고, x를 입력하기 전까지의 문자가 입력
도스 명령어 type 프로그램 list.c 명령행 인자를 사용해서 파일의 내용을 표준출력으로 그대로 출력하는 프로그램 명령행 인자에서 두 번째 인자가 파일 이름에 해당 list filename 파일 내용의 출력은 한 줄마다 맨 앞에 줄 번호를 출력 www.woori.ac.kr
텍스트 파일 입력과 출력 함수 fprinf()와 fsanf_s() 자료의 입출력을 텍스트 모드로 처리
이진 파일 입력과 출력 함수 fwrite()와 fread() 이진(binary) 파일 이진(binary) 모드로 블록 단위 입출력을 처리하려면 함수 fwrite()와 fread()를 이용 이진(binary) 파일 자료형을 모두 유지하면서 바이트 단위로 저장되는 파일
함수 fwrite() 4개의 인자 첫번째 인자: 두 번째 인자: 세 번째 인자: 마지막 인자: ptr은 출력될 자료의 주소값 두 번째 인자: size는 출력될 자료 항목의 바이트 크기 세 번째 인자: 출력될 항목의 개수이며 마지막 인자: 출력될 파일 포인터 함수 fwrite()에서 세번째 항목인 출력항목 수 4를 지정한 경우의 출력
이진 파일을 위한 파일 처리 모드 문자 ‘b’를 추가 이진(binary)을 의미하는 b는 모든 파일 열기 모드에 이용
학생 성적 구조체 파일 쓰기 fwrite.c 학생의 성적 정보를 구조체로 표현하고, 표준입력으로 여러 명의 자료를 입력받은 구조체 자료형을 파일“score.bin”에 저장하는 프로그램 이진 파일 score.bin이 프로젝트 폴더에 생성
프로그램에서 생성한 이진 파일 읽기 fread.c 이진 파일 score.bin의 내용을 읽어 표준출력하는 프로그램을 작성 www.woori.ac.kr
파일 접근 처리 파일 위치 파일 내부를 바이트 단위로 파일 내부 위치를 나타내는 값 파일위치를 파일 지시자(file indicator) 또는 파일 표시자 라고도 부름 파일의 시작점에서 파일 위치는 0이며 1바이트마다 1씩 증가 파일을 열면 파일 위치(file position)는 항상 파일의 시작 부분에 위치 파일의 마지막에는 파일의 마지막임을 알리는 EOF(End Of File) 표시가 있음
파일 접근 처리 파일 스트림 연결 시 파일 위치 파일을 처음으로 열면 모드에 관계없이 파일 위치는 모두 0 파일 모드가 추가(a)인 경우 파일을 처음 열면 파일 위치는 0이나 자료를 파일에 쓰면 자동으로 파일 위치가 마지막으로 이동되어 추가 그러나 파일 위치를 임의로 이동하였다면 파일의 마지막으로 이동하여 추가
파일 접근 방법 파일 순차적 접근(sequential access) 임의 접근(random access) 파일 위치를 처음부터 하나씩 증가시키면서 파일을 참조하는 방식 임의 접근(random access) 파일의 어느 위치든 바로 참조하는 방식
파일의 임의 접근 함수 함수 fseek() 파일 위치를 자유자재로 이동하는 함수 헤더 파일 stdio.h
파일 위치와 관련된 함수 함수 ftell(), rewind()
학생 성적 정보를 추가하는 프로그램 appendscorefile.c 앞의 예제 프로그램을 발전시켜 더 많은 학생의 성적 정보를 추가하는 프로그램 제일 먼저 파일 score.bin에 있는 학생 정보를 모두 읽어와 출력 다음에는 파일에 있는 마지막 학생 정보로부터 마지막 학생 번호를 인지 이 번호에 1씩 증가시키면서 다음에 추가될 학생의 번호로 이용 추가될 학생 정보는 학생마다 한 행씩 자료를 받아서 파일 score.bin에 추가 키보드 ctrl + z를 누르면 입력이 종료되고 다시 파일 score.bin에서 모든 자료를 읽어 모든 정보를 출력 파일 score.bin을 모드“a+”로 open 학생 정보를 추가도 하고, 다시 읽기도 하기 위한 목적
입출력 함수 텍스트 파일 입출력 헤더 파일 stdio.h에 그 함수원형이 정의
입출력 함수 이진 파일 입출력 함수 getw()와 putw() 헤더 파일 stdio.h에 그 함수원형이 정의 워드(word) 크기의 int형 정수를 파일에 이진 모드로 입출력하는 함수 현재 함수 _getw()와 _putw()의 사용을 권장
파일 삭제, 이름 바꾸기 함수 remove(), rename() 지정된 특정한 파일을 삭제 함수 지정된 파일 또는 폴더의 이름을 새로운 이름으로 바꾸는 역할 헤더 파일 stdio.h에 함수원형이 정의
파일이름 수정 rename.c 함수 rename()을 사용하여 파일 이름을 수정하는 프로그램 명령행 인자 old.c new.c
Thank You !