제13장 파일 처리
파일열기 : File Open FILE *fp; fp=fopen( filename, r ); File handling mode: r, w, a, rb, wb, ab, r+, w+, a+ fclose(fp) 파일의종류 : Text File, Binary File Text file:.txt,.doc,.hwp Binary file:.exe,.jpg,.gif,.mov,.mpeg,.tif,.pgm,.ppm. 파일읽기 / 쓰기 : Read/Write a file fscanf, fgetc, getc, fprintf, fputc, putc, fgets, fputs: for text file fgetc, getc, fputc, putc, fwrite: for binary file 한밭대정보통신공학과 и чунг хо 2
파일열기 : fopen() 함수를사용한다. 형태 : File *fopen(const char filename*, const char *mode); Ex.) FILE *fp=fopen( test.txt, w ); // 파일을쓰기모드로연다. 모드는 r:read 읽기, w: write 쓰기, a:append 첨가형태가있다. 한밭대정보통신공학과 и чунг хо 3
파일을 fcolse() 를이용하여닫지않고계속사용하려고할때모드는 r+ : 읽은후쓰기, w+ : 쓴후읽기, a+ : 추가후읽기또는쓰기, 이경우쓰기는파일끝에만가능 한밭대정보통신공학과 и чунг хо 4
파일출력함수 fprintf : printf 의파일출력버전 int fprintf(file *, const char *, ) 예 ) FILE *fp=fopenf( test.txt, w ); fprintf(fp, %s %d, 홍길동, 99); 파일입력함수 fscanf : scanf 의파일입력버전 int fscanf(file *, const char *, ) 예 ) char name[20]; int score; FILE *fp=fopenf( test.txt, r ); fscanf(fp, %s %d,name, score); 한밭대정보통신공학과 и чунг хо 5
파일출력함수 fprintf 가 printf 함수와동일할때 FILE pointer 대신 stdout 또는 stderr 을쓸때예 ) fprintf(stdout, %s %d, 홍길동, 99); fprintf(stderr, %s %d, 홍길동, 99); stdout, stderr 은 stdio.h 에정의된표준출력, 표준에러로모니터화면에출력됨을의미. 파일입력함수 fscanf 가 scanf 와동일할때예 ) char name[20]; int score; fscanf(stdin, %s %d,name, score); stdin 은 stdio.h 에정의된표준입력즉키보드 한밭대정보통신공학과 и чунг хо 6
표준입출력함수 gets 와 puts 의파일입출력버전임. 함수이름앞에 f 를붙여서파일입출력버전으로만든것중하나임. char *fgets(char *, int, FILE *); 예 ) char buf[81]; FILE *fp=fopen( test.txt, r ); fgets(buf, 81, fp);// 파일에서 buf 로한줄읽기 int fputs(char *, FILE *); 예 ) char buf[81]= 버퍼에있던내용 ; FILE *fp=fopen( test.txt, w ); fgets(buf, 81, fp); //buf 의내용을파일에쓰기 한밭대정보통신공학과 и чунг хо 7
파일출력함수 fgetc(), fputc() 는 getc(), putc() 와각각완전히동일 int fgetc(file *) : int getc(file *) 와동일 int fgetc(int, FILE *) : int getc(int, FILE *) 와동일예 ) char ch; FILE *fpi=fopen( source.txt, r ); FILE *fpo = fopen( target.txt, w ); while( (ch=fgetc(fpi))!= EOF) //End of File putc(ch, fpo); //textfile을한문자씩읽어다가다른파일에복사하는프로그램임. 한밭대정보통신공학과 и чунг хо 8
표준입출력에사용되는 getchar(), putchar() 는 getc(), putc() 를사용하여매크로로정의됨 #define getchar() getc(stdin) #define putchar(_c) putc((_c),stdout) 한밭대정보통신공학과 и чунг хо 9
텍스트파일 : 문서편집기로문서를편집할수있고파일을열었을때문자가다보이는파일. 텍스트파일의예 :.doc,.hwp,.txt,.c,.cpp,.java 등으로끝나는파일들 fprintf(), fscanf() 로자료의입출력을텍스트모드로처리 이진파일 (binary file): 바이트단위로저장하는파일, 파일을문서편집기로열었을때일부또는전부가읽을수없는파일..exe 과같은실행파일,.jpb,.pgm,.tiff,.mpeg,.avi 등사진또는비디오파일,.mp3 과같은오디오파일등 한밭대정보통신공학과 и чунг хо 10
텍스트파일과이진파일에서 255 라는숫자의저장방식 텍스트파일 : 2 5 5 라는세글자의숫자로서 3bytes 가필요 바이너리파일 : 1 바이트에이진수 11111111 과같은이진파일로저장됨. 한밭대정보통신공학과 и чунг хо 11
EOF: 텍스트파일의끝으로서 -1 과같음 foef() 함수는 EOF 로끝나지않는이진파일의끝을체크할수있는함수, 텍스트파일의끝도찾음. 파일끝이면 0 이아닌값을반환, 끝이면 NULL 반환 예 ) FILE *fpi = fopen( test.jpg, rb ); //b 는 binary file 의미 while(!feof(fp)) putc(getc(fp), fpo); // 이진파일의복사, 텍스트파일도복사가능 // 파일입출력모드에이진파일의경우 b 를붙임 // rb, wb, ab, rb+, r+b, wb+, w+b, ab+, a+b 한밭대정보통신공학과 и чунг хо 12
foef() 함수 int feof(file *); 표준입력인경우 while(!feof(stdin)){ }; // 이경우파일의끝은 ^Z 를입력, UNIX 운영체제에서는 ^D 를사용 ferror() 함수 int ferror(file *); // 파일처리오류시 0 반환, 아니면 0 이아닌값을반환 한밭대정보통신공학과 и чунг хо 13
이진파일의읽기쓰기함수 size_t fwrite(const void *, size_t, size_t, FILE *); size_t fread(const void *, size_t, size_t, FILE *); // 인자설명 (buffer, 입출력단위의바이트크기, 개수, 파일포인터 ) // 반환값은입력또는출력한자료형의개수 한밭대정보통신공학과 и чунг хо 14
예 ) 가로세로 256x256 크기의.pgm 이미지파일을복사하는프로그램헤더부분 : P2 256 256 255\n 여기서 P2는회색파일임을의미로정해져있음. 256 256 은각각가로세로크기 255는 graylevel의최대값으로항상같은값. \n은정해져있음. 그다음약간의코멘트가계속될수있음. FILE *fpi=fopen( lena.pgm, rb ); // 이진파일읽기모드열기 FILE *fpo=fopen( copy.pgm, wb );// 이진파일쓰기모드열기 int i; char magic[3]; int hsize, vsize; unsigned char buf[256]; fscanf(fpi, %s%d%d, magic, &hsize, &vsize); // 입력파일의헤더읽기 fprintf(fpo, %s %d %d 255\\n, magic, &hsize, &vsize); // 출력파일헤더쓰기 한밭대정보통신공학과 и чунг хо 15
// 파일에서 256 바이트씩읽어서쓰기 unsigned char buf[256]; for(i=0;i<256;i++) { fread(buf, sizeof(unsigned char), 256, fpi); fwrite(buf, sizeof(unsigned char), 256, fpo); } 한밭대정보통신공학과 и чунг хо 16
int fseek(file *fp, long offset, int mode); Mode: SEEK_SET 파일의시작 SEEK_CUR 파일의현재위치 SEEK_END 파일의끝위치파일의끝에서 300000 바이트만큼앞쪽으로이동 fseek(fpi, -300000, SEEK_END); 파일의앞에서 200000 바이트만큼끝쪽으로이동 fseek(fpi, 200000, SEEK_SET); 한밭대정보통신공학과 и чунг хо 17
음악 / 음악샘플 /Kalimba.mp3 파일의끝에서 300000 bytes 를읽어서쓰기 FILE *fpi = fopen( Kalimba.mp3, rb ); FILE *fpo = fopen( ba.mp3, wb ); int i; fseek(fpi, -300000, SEEK_END); for(i=0;i<300000;i++) putc(fgetc(fpi), fpo); 한밭대정보통신공학과 и чунг хо 18
파일의크기를알아내는프로그램 FILE *fpi = fopen( Kalimba.mp3, rb ); fseek(fpi,0, SEEK_END); printf( file size = %d\n, ftell(fpi)); 한밭대정보통신공학과 и чунг хо 19
파일열기 : File Open 구조체 Structure FILE *fp; Struct TAGNAME { int a; double b; char c[12];} s; fp=fopen( filename, r ); Allocation of Initial Value File handling mode: r, w, a, rb, wb, ab, r+, w+, a+ Structure Array fclose(fp) Reference of Structure Members 파일의종류 : Text File, Binary File 공용체 Union Text file:.txt,.doc,.hwp Union TAGNAME { int a; double b; char c[12];} Binary Data file:.exe, usage,.jpg, length.gif, of.mov, union.mpeg,.tif,.pgm,.ppm. 열거형 Enum 파일읽기 / 쓰기 : Read/Write a file enum fscanf, color fgetc, {yellow, getc, fprintf, red, blue, fputc, magenta, putc, fgets, green} fputs: col; for text file fgetc, getc, fputc, putc, fwrite: for binary file 한밭대정보통신공학과 и чунг хо 20