파일입출력 Heeseung Jo
이장의내용 파일과파일포인터 파일입출력함수 임의접근파일처리 2
파일과파일포인터
파일 파일은모든데이터를연속된바이트형태로저장 4
C 언어의파일종류 텍스트파일 (text file) 사람들이읽을수있는문자들을저장하고있는파일 텍스트파일에서 " 한줄의끝 " 을나타내는표현은파일이읽어들여질때, C 내부의방식으로변환 예, a.txt, main.c, mylib.h,... 이진파일 (binary file) 모든데이터는있는그대로바이트의연속으로저장 이진파일을이용하여메모리에저장된변수값형태그대로파일에저장 예, a.jpg, 1.mp3, 2.mp4,... 5
파일열기 파일을사용하기위해서는반드시먼저파일열기 (fopen) 를해야함 파일열기를하면 FILE ( 구조체에대한 ) 포인터가리턴 FILE 포인터는열린파일을지정 FILE 구조체 stdio.h에정의되어있음 열려진파일의현재상태를나타내는필드변수들 특히파일입출력에사용되는버퍼관련변수들 6
표준입출력 stdin, stdout, stderr 프로그램의입출력을위해서만들어지는특별한파일 각각표준입력, 표준출력, 표준오류를나타내는 FILE 포인터 C 프로그램이실행되면자동적으로열리고프로그램이종료될때자동으로닫힘 7
파일열기 함수 fopen() 예예 FILE *fopen(const char *filename, const char *mode); const char *filename: 파일명에대한포인터 const char *mode: 모드로파일을여는형식 FILE *fp; fp = fopen("c:\work\text.txt", "r"); if (fp == NULL) { printf(" 파일열기오류 \n"); } fp = fopen("outdata.txt", "w"); fp = fopen("outdata.txt", "a"); 8
fopen 모드 9
파일닫기 파일을열어서사용한후에는파일을닫아야함 int fclose(file *fp ); fp 는 fopen 함수에서받았던포인터 닫기에성공하면 0, 오류일때는 EOF(-1) 를리턴 예 fclose(fp); 10
파일입출력함수
파일입출력함수 12
줄단위입출력 fgets() 함수와 fputs() 함수 텍스트파일에서한줄씩읽거나쓸수있음 char* fgets(char *s, int n, FILE *fp); 파일로부터한줄을읽어서문자열포인터 s 에저장하고 s 를리턴 개행문자 ('\n') 나 EOF 를만날때까지파일로부터최대 n-1 개의문자를읽고읽어온데이터의끝에는 NULL 문자를붙여줌 파일을읽는중파일끝혹은오류가발생하면 NULL 포인터리턴 int fputs(const char *s, FILE *fp); 문자열 s 를파일포인터 fp 가가리키는파일에출력 성공적으로출력한경우에는출력한바이트수를리턴 출력할때오류가발생하면 EOF 값을리턴 13
14
파일이름을인수로주어야함 15
포맷입출력 fprintf() 함수 printf() 함수와같은방법으로파일에데이터를츨력 int fprintf(file *fp, const char *format,...); - fprintf 함수의첫번째인수 fp 는츨력할파일에대한 FILE 포인터 - 두번째부터의인수는 printf 함수와동일 fscanf() 함수 scanf() 함수와같은방법으로파일로부터데이터를읽어들일수있음 int fscanf(file *fp, const char *format,...); - fscanf 함수의첫번째인수 fp 는입력받을파일에대한 FILE 포인터 - 두번째부터의인수는 scanf 함수와동일 16
17
18
기타파일관련함수 int feof(file *fp) 파일포인터 fp 가파일의끝을탐지하면 0 이아닌값을리턴 파일끝이면 0 을리턴 int fflush(file *fp) 아직기록되지않고버퍼에남아있는데이터를 fp 가가리키는출력파일에저장 버퍼비우기기능을수행하는함수 19
이진파일
블록입출력 fread() 와 fwrite() 한번에일정한크기의데이터를파일에읽거나쓰기위한입출력함수 int fread(void *buf, int size, int n, FILE *fp); fp가가리키는파일에서 size 크기의블록 ( 연속된바이트 ) 을 n개읽어서버퍼포인터 buf가가리키는곳에저장 읽어온블록의개수를리턴 int fwrite(const void *buf, int size, int n, FILE *fp); 파일포인터 fp 가지정한파일에버퍼 buf 에저장되어있는 size 크기의블록 ( 연속된바이트 ) 을 n 개기록 성공적으로출력한블록개수를리턴 21
블록입출력 기본아이디어 어떤자료형의데이터이던지그데이터를연속된바이트로해석해서파일에저장 파일에저장된데이터를연속된바이트형태로읽어서원래자료형변수에순서대로저장하여원래데이터를그대로복원 예 : record 저장 / 읽기 struct student record; FILE *fp = fopen("intfile", "wb+"); fwrite(&record, sizeof(record), 1, fp); fread(&record, sizeof(record), 1, fp); 22
fwrite(), fread() fwrite(&record, sizeof(record), 1, fp); fread(&record, sizeof(record), 1, fp); 23
이진파일입출력모드 24
25
26
27
임의접근파일처리
파일내위치 파일위치 (file position) 열린파일에서다음읽거나기록할파일내위치 파일위치지정자 (file position indicator) 시스템내에그파일의파일위치를저장하고있음 fgets() 나 fread() 로지속적으로읽으면처음부터끝까지읽게되는이유 -> 위치지정자가어디까지읽었는지를알고있기때문임 29
파일위치관련함수 fseek(file *fp, long offset, int mode) 파일위치지정자를임의로설정할수있는함수 rewind(file *fp) 파일위치를파일시작점에위치시킴 ftell(file *fp) 파일의현재파일위치를나타내는파일위치지정자값리턴 30
파일위치관련함수 fseek(file *fp, long offset, int mode) FILE 포인터 fp 가가리키고파일의파일위치를모드 (mode) 기준으로오프셋 (offset) 만큼옮김 31
fseek() 사용예 예 1 예 2 fseek(fp, 0L, SEEK_SET) 파일처음으로이동 fseek(fp, 100L, SEEK_CUR) 현재위치에서 100 바이트이동 fseek(fp, 0L, SEEK_END) 파일끝으로이동 fseek(fp, n * sizeof(record), SEEK_SET) - n+1 번째레코드시작위치로이동 fseek(fp, sizeof(record), SEEK_CUR) - 다음레코드시작위치로이동 fseek(fp, -sizeof(record), SEEK_CUR) - 전레코드시작위치로이동 32
fseek() 사용예 예 3 fwrite(&record1, sizeof(record), 1, fp); fwrite(&record2, sizeof(record), 1, fp); fseek(fp, sizeof(record), SEEK_END); fwrite(&record3, sizeof(record), 1, fp); 33
예제프로그램 구조체를이용하여학생정보를파일에저장한다 시작 ID(START_ID) 로부터상대적인위치에저장 (record.id - START_ID) * sizeof(record) 파일에저장된특정학생의데이터를검색해서출력 시작 ID(START_ID) 로부터상대적인위치에서읽음 (id - START_ID) * sizeof(record) 34
35
36
37
38
프로그래밍실습
프로그래밍실습 도서관리시스템 도서에대한데이터입력과도서에대한열람기능을제공하는간단한도서관리시스템을구현 이시스템은도서입력과도서열람을위한두개의프로그램으로구성 1. 헤더파일 book.h 작성 struct book { }; int seq; char title[50]; char author[20]; int price; 40
프로그래밍실습 2. 도서입력프로그램 도서관에새로운책이들어올때마다책에대한정보를입력받아파일에저장 책에대한정보는이름, 저자, 가격이며책이들어오는순서에따라 1 번부터일련번호를부여 2.1 book.h 헤더파일을 include 2.2 FILE 포인터, struct book 타입의필요한변수를선언 2.3 fopen() 함수를이용하여도서정보를저장하기위한파일을오픈 2.4 scanf() 함수를이용하여새로들어온책에대한정보를입력받아구조체변수에저장 2.5 fwrite() 함수를이용하여구조체변수에있는책정보를파일에저장 2.6 2.3 부터 2.5 의과정을더이상입력이없을때까지반복 41
프로그래밍실습 3. 도서열람프로그램 책의일련번호를입력받아해당책정보를찾아출력해주는프로그램을작성 3.1 book.h 헤더파일을 include 3.2 FILE 포인터, struct book 타입의필요한변수를선언 3.3 fopen() 함수를이용하여도서정보를저장하기위한파일을오픈 3.4 책일련번호를입력받고해당책의레코드위치를계산 3.5 fread() 함수를이용하여해당레코드를읽어서구조체변수에저장 3.6 읽어온책에대한정보를출력 42