13 파일처리 1
함수 fopen() 파일열기 파일을만들기위해서는함수 fopen() 을이용 함수 fopen() 의함수원형은다음과같으며헤더파일 stdio.h 파일에정의 함수 fopen() 은두개의문자열전달인자를이용, 반환값은포인터값인 FILE * 2
파일열기 인자 함수 fopen() 에서 첫번째문자열은처리하려는파일이름이고, 두번째문자열은파일처리종류 ( 모드 ) FILE *f; char fname[] = "basic.txt"; if ((f = fopen(fname, "w")) == NULL) { printf( " 파일이열리지않습니다.\n" ); }; fclose(f); 조건문 if 를위와같이함수 fopen() 과함께이용하면파일열기에실패할경우문장 " 파일이열리지않습니다.\n" 을출력 파일처리가모두끝났으면파일포인터 f 를인자로함수 fclose(f) 를호출하여반드시파일을닫도록 3
파일처리모드 파일처리모드종류의미 함수 fopen() 의두번째인자는파일처리종류 ( 모드 ) r, w, a, r+, w+, a+ 의종류 4
예제 13-1 5
함수 fprintf, fscanf 파일에자료를쓰거나읽기위하여함수 fprintf() 와 fscanf() 를이용 이함수를이용하기위해서는헤더파일 stdio.h 파일을포함 함수 fprintf() 와 fscanf() 의함수원형 int fprintf(file *, const char *,...); int fscanf(file *, const char *,...); 위함수의첫번째인자는입출력에이용될파일이고, 두번째인자는입출력되는문자열이며, 다음인자들은입출력될변수목록 함수원형에서기호 은여러인자가계속됨을의미 함수 fprintf() 와 fscanf() 를표준입출력에도이용가능 즉함수 fprintf() 와 fscanf() 의첫번째인자에각각 stdin 또는 stdout 를이용하면표준입력, 표준출력으로이용이가능 기호상수 stdin, stdout 은 stderr 과함께헤더파일 stdio.h 에정의되어있는값으로각각표준입력, 표준출력, 표준에러를의미 6
예제 13-2 7
함수 fgets() 와 fputs() 함수 fgets() 와 fputs() 파일에문자열을입출력하는함수로 fgets() 와 fputs() 이함수도헤더파일 stdio.h 파일에다음과같은함수원형으로정의 함수 fgets() 는문자열을개행문자 (\n) 까지읽어개행문자도함께입력문자열에저장 마찬가지로함수 fputs() 는문자열을그대로출력 함수 fgets() 인자 첫번째인자는문자열이저장될문자포인터이고, 두번째인자는입력할문자의최대수이며, 세번째인자는입력문자열이저장될파일 함수 fputs() 인자 첫번째인자는출력될문자열이저장된문자포인터이고, 두번째인자는문자열이출력되는파일 char * fgets(char *, int, FILE *); int fputs(char *, FILE *); 8
함수 fgetc() 와 fputc() 문자하나를파일에입출력하는함수로 fgetc() 와 fputc() 를제공 이함수의원형은헤더파일 stdio.h 에정의 이함수들은문자하나의입출력의대상인파일포인터를인자로이용 int fgetc(file *); int fputc(int, FILE *); 이함수와같은함수로 getc() 와 putc() 도이용가능 int getc(file *); int putc(int, FILE *); 문자의표준입출력에이용되는 getchar() 와 putchar() 는다음과같이함수 getc() 와 putc() 를이용한매크로 #define getchar() #define putchar(_c) getc(stdin) putc((_c),stdout) 함수 fgetc() 와 fputc() 는 getc() 와 putc() 와그기능은동일하며, fgetc() 와 fputc() 는함수이고, getc() 와 putc() 는매크로 9
함수 feof() 와 ferror() 함수 feof() 파일의내부포인터위치가파일의끝 (EOF) 인지를검사하는데필요한함수 이함수는헤더파일 stdio.h 에다음함수원형으로정의 int feof(file *); 파일의위치가파일의마지막 (end of file) 인지를검사하여, 파일의마지막이면 0 이아닌값을, 파일의마지막이아니면 0 을반환 그러므로표준입력에서계속적으로입력을받는구문으로다음을이용가능 while (!feof(stdin)) { } 함수 ferror() 파일처리에서오류가발생했는지검사하는함수 함수의원형은헤더파일 stdio.h 에정의 int ferror(file *); 이전파일처리에서오류가발생하면 0 이아닌값을발생하고, 오류가발생하지않으면 0 을반환 10
예제 13-3 11
예제 13-4 목적 list filename 을입력 파일 filename 의내용을표준출력으로출력하는프로그램 조건 명령어줄인자를활용, 두번째인자가파일이름에해당 파일내용의출력은한줄마다맨앞에줄번호를출력 12
텍스트파일과이진파일 텍스트파일 텍스트파일은텍스트편집기 ( 에디터 ) 로그내용을알수있으며, 그내용을확인할수있을뿐만아니라인쇄가가능 함수 fprintf() 와 fscanf() 는자료의입출력을텍스트모드로처리 함수 fprintf() 를이용하여정수형변수 cnt 에저장된값을파일 f 에출력하는과정 이진파일 텍스트파일과는다르게이진 (binary) 파일은 C 언어의자료형을모두유지하면서바이트단위로저장하는파일 이진파일의대표적인예가실행파일, 이러한이진파일은일반편집기로는그내용확인불가능 13
함수 fwrite 와 fread 이진파일처리 이진 (binary) 모드로입출력을처리하려면함수 fwrite() 와 fread() 를이용 함수 fwrite() 는헤더파일 stdio.h 에다음과같은함수원형으로정의 size_t fwrite(const void *, size_t, size_t, FILE *); size_t fread(void *, size_t, size_t, FILE *); 이진파일에저장되어있는자료형을입력하는함수 fread() 각각의인자는출력함수 fwrite() 와동일 인자와반환값 인자 첫번째인자는출력될자료의주소값이며, 두번째인자는출력될자료의바이트크기이고, 세번째인자는출력될단위자료의묶음개수이고, 마지막인자는출력될파일포인터 반환값값은파일에출력된단위자료형의개수 위에서첫번째인자의자료형이 void * 로모든자료형의포인터를대신할수있는포인터변수 14
이진파일입출력이해 함수 fwrite() 를이용하여정수형변수 cnt 값을파일 f 에출력하는과정 함수 fwrite() 는바이트단위로원하는블록을파일에출력하기위한함수 함수 fwrite() 에의하여출력된자료는함수 fread() 를이용하여입력해야그자료유형유지가가능 15
이진파일열기모드 문자 b 추가 이진파일을위한파일열기모드에서문자 b 를추가 이진 (binary) 을의미하는 b 는모든파일열기모드에이용 파일열기모드에서 b 가없으면기본적으로텍스트파일을의미 FILE *f = fopen(fname, "wb"); 16
예제 13-5 17
파일내부위치 파일위치포인터 파일을열면항상파일위치포인터 (file pointer) 라는것이파일의한장소를가리킴 파일내부를바이트단위로파일내부위치를나타내는값 파일포인터가 100L 이라면파일의처음에서부터 100 바이트떨어진위치에현재파일포인터가위치 파일포인터값은일반적으로자료형 long 으로취급하므로상수를기술할때 100L 처럼수뒤에 L 을기술가능 파일포인터는파일내부에서자료를읽거나쓰는만큼파일의현재위치에서뒤로이동 순차적, 임의접근 파일에서원하는장소로자유롭게이동하는것을임의접근 (Random Access) 파일의임의접근을처리하기위해서는파일포인터를자유자재로이동하는함수 fseek() 이필요 18
함수 fseek() fseek() 함수 fseek() 는함수원형이헤더파일 stdio.h 파일에정의 함수 fseek() 는파일 fptr 에서기준점 mode 에서 offset 만큼떨어진곳으로파일포인터를위치하는함수 offset 함수 fseek() 에서두번째인자는 long 유형으로기준점으로부터떨어진값을말하며흔히오프셋 (offset) 이라함 함수 fseek() 에서세번째인자는정수형기호상수로다음세가지중의하나를이용 int fseek(file *fptr, long offset, int mode) 19
기준세가지 함수 fseek(f, 100L, SEEK_SET) 의호출 파일의처음위치에서 100 바이트떨어진위치로이동 함수 fseek(f, 100L, SEEK_CUR) 의호출 파일의현재위치에서 100 바이트떨어진위치로이동 함수 fseek(f, -100L, SEEK_END) 의호출 파일끝위치에서앞으로 100 바이트떨어진위치로이동 20
파일관련여러함수 함수 fseek() 에서두번째인자는세번째인자인기준점으로부터떨어진값을말하며, 양수는뒤, 음수는앞으로방향을지시 파일포인터와관련된함수로서다음세가지함수를이용 함수 ftell() 은인자인파일의파일포인터를반환하며 함수 rewind() 는파일포인터를무조건제일앞으로이동 21
예제 13-7 appendscore.c 바로이전에작성한 readscorefile.c 프로그램을발전시켜더많은학생의성적정보를추가하는프로그램을작성 프로그램이실행되면제일먼저파일 score.bin 파일에있는학생정보를모두읽어와출력 파일에있는마지막학생정보로부터마지막학생번호를알아냄 이번호에 1 씩증가시키면서다음에추가될학생의번호로이용 22
입출력함수 여러입출력함수 23
파일삭제, 이름바꾸기 함수 remove() 지정된특정한파일을삭제하고 함수 remove() 는 remove( sample.txt ) 와같이문자열로지정된파일을삭제 함수 rename() 지정된파일의이름을새로운이름으로바꾸는역할을수행 함수 rename() 은 rename( oldname.txt, newname.txt ) 과같이앞의파일이름을뒤파일이름으로바꾸는역할 함수 remove() 와 rename() 도헤더파일 stdio.h 에그함수원형이정의 24
예제 13-8 25
C 로배우는프로그래밍기초 2 nd Edition 26