18강 파일처리함수(2) 강 의 내 용 1 2 3 4 순차파일 만들기와 읽기 순차파일 입출력함수 랜덤파일 처리 강 의 내 용 1 순차파일 만들기와 읽기 2 순차파일 입출력함수 3 랜덤파일 처리 4 랜덤파일 만들기와 읽기
putc() fputc() fputs() fprintf() 순차파일 만들기 순차파일 출력함수 디스크에 만들어진 파일에 자료를 기록하는 함수 putc() fputc() fputs() fprintf() getc() fgetc() fgets() fscanf() 순차파일 입력함수
순차파일 출력함수 putc() 함수 - 문자 단위의 파일 출력함수 - fputc() 함수와 유사 사용 예 : putc(c, fp); 기능 : fp가 가리키는 파일에 변수c에 있는 문자를 출력
putc() 함수의 사용 예 #include <stdio.h> #include <stdlib.h> KOREA SEOUL JONGRO-GU DONGSUNG-DONG Korea National Open University ^Z Enter #include <stdio.h> #include <stdlib.h> void main(){ FILE *fp; char c; fp=fopen("sample1.dat", "w"); if(fp==NULL) { printf("파일을 개방할 수 없습니다!"); exit(1); } while((c = getchar()) != EOF) putc (c, fp); fclose(fp); 파일 포인터 선언 파일을 텍스트 파일, 쓰기 모드로 개방 자료의 끝을 의미하므로 위의 내용이 들어 있는 sample.dat파일이 만들어짐 파일 개방 에러체크 에러 메시지 출력 프로그램을 끝냄 문자 출력의 끝을 판별 파일 닫기 문자를 파일로 출력
순차파일 출력함수 fputs() 함수 - 문자열을 파일로 출력할 때 사용 형식 : fputs(문자열변수, 파일포인터 변수); 사용 예 : fputs(s, fp) 기능 : 지정된 파일에 문자열(하나의 레코드) 을 출력
fputs() 함수의 사용 예 # include <stdio.h> # include <stdlib.h> # include <sting.h> void main() { char name[64]; FILE *fp; if((fp=fopen("sample2.dat", "w"))==NULL){ puts("파일을 개방할 수 없습니다!"); exit(1); } gets(name); while(strcmp(name, "end" )){ strcat(name, "\n"); fputs(name, fp); fclose(fp); KIM HG PARK SY KIM HS CHOI DS LEE SY end Enter sample2.dat라는 파일이 만들어짐 sample2.dat라는 파일을 쓰기 모드로 개방하고, 에러 발생 시 메시지 출력 입력된 문자열이 end가 아닐동안 loop 계속( strcmp(): 2개의 문자열을 비교하는 문자열 조작함수) 문자열을 입력받음 하나의 문자열에 다른 것 (“\n”)을 추가 하는 문자열 조작함수 문자열을 fp가 가리키는 파일에 출력 파일 닫음
fprintf() 함수 fprintf() 함수 - 지정된 형식을 가지고 파일에 자료를 출력 - 여러 항목의 복합적인 자료로 구성된 레코드를 저장할 때 유용 형식: fprintf(파일포인터 변수, “출력형식”, 변수); 사용 예: fprintf(fp, “%s %d”, a, b); 기능: 지정된 형식대로 자료를 파일포인터 변수가 가리키는 곳에 출력
fprintf() 함수의 사용 예 #include <stdio.h> #include <stdlib.h> 학번 이름 중간 기말 레포트 출석 점수를 입력 97001 KIM_HG 29 28 30 10 97002 PARK_SY 20 20 25 10 97003 LEE_SY 25 20 20 10 97004 CHOI_DS 23 25 26 10 97005 KIM_HS 28 23 25 10 Enter #include <stdio.h> #include <stdlib.h> void main(){ FILE *fp; char no[10], name[10]; int mid, term, rep, att, i; fp=fopen("sample3.dat", "w"); if(fp==NULL){ printf("파일을 개방할 수 없습니다!"); exit(1); } sample3.dat 파일이 만들어짐 fprintf(stdout, "학번 이름 중간 기말 레포트 출석 점수를 입력\n"); for(i=0;i<5;++i) { scanf("%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); "stdout"-모니터를 가리키는 특수한 파일 포인터이다.(“stdin”-키보드) 지정된 출력 형식으로 자료를 파일에 출력
getc() fgetc() fgets() fscanf() 순차파일 읽기 순차파일 입력함수 파일 출력함수에 의해 만들어진 순차파일의 저장된 자료를 읽어 내는 함수 파일의 끝에 있는 EOF 신호를 만날 때까지 읽을 수 있는 프로그램 작성 getc() fgetc() fgets() fscanf()
순차파일 입력함수 getc() 함수 - 문자 단위의 파일 입력함수 - fgetc() 함수와 유사 사용 예 : c=getc(fp); 기능 : 지정된 파일로부터 한 문자를 읽어온다
getc() 함수에 의해 한 문자씩 읽어 와 c에 전달 KOREA SEOUL JONGRO-GU DONGSUNG-DONG Korea National Open University #include <stdio.h> #include <stdlib.h> void main(){ FILE *fp; char c; fp=fopen("sample1.dat", "r"); if(fp==NULL){ printf("파일을 개방할 수 없습니다!"); exit(1); } while((c=getc(fp)) != EOF) putchar(c); fclose(fp); sample1.dat 파일을 읽기 모드로 개방 getc() 함수에 의해 한 문자씩 읽어 와 c에 전달
순차파일 입력함수 fgets() 함수 - 파일에 저장된 문자열 자료를 읽을 때 사용 - 읽어 낼 문자열의 길이를 반드시 명시 사용 예 : fgets(s, 40, fp); 기능 : 지정된 파일로부터 해당 문자열 길이 만큼의 문자를 읽어와 문자열 변수에 저장한다.
fgets() 함수의 사용 예 #include <stdio.h> #include <stdlib.h> KIM HG PARK SY KIM HS CHOI DS LEE SY #include <stdio.h> #include <stdlib.h> void main(){ char name[20]; FILE *fp; if((fp=fopen("sample2.dat", "r"))==NULL) { puts("파일을 개방할 수 없습니다!"); exit(1); } while((fgets(name, 20, fp)!= NULL)) printf("%s", name); fclose(fp); sample2.dat라는 파일을 읽기 모드로 개방하고, 에러 발생 시 메시지 출력 파일의 끝에 도달할 때까지 읽기를 계속 레코드의 끝에 CR/LF신호가 저장되어 있으므로 개행문자 '\n'을 넣지 않아도 됨
순차파일 입력함수 fscanf() 함수 - 일반적으로 파일의 끝을 판별하는 feof() 함수와 - 숫자, 문자 등 복합적인 자료로 구성된 레코드를 읽을 때 사용 - 일반적으로 파일의 끝을 판별하는 feof() 함수와 같이 사용 형식 : fscanf(파일포인터 변수, “입력형식”, 변수); 사용 예 : fscanf(fp, “%s %d”, &a, &b); 기능 : 파일 포인터가 가리키는 곳으로부터 지정된 형식대로 자료를 읽어 온다..
fscanf() 함수의 사용 예 #include <stdio.h> #include <stdlib.h> 학번 이름 중간 기말 리포트 출석 97001 KIM_HG 29 28 30 10 97002 PARK_SY 20 20 25 10 97003 LEE_SY 25 20 20 10 97004 CHOI_DS 23 25 26 10 97005 KIM_HS 28 23 25 10 #include <stdio.h> #include <stdlib.h> void main(){ FILE *fp; char no[10], name[10]; int mid, term, rep, att, i; fp=fopen("sample3.dat", "r"); if(fp==NULL) printf("파일을 개방할 수 없습니다!"); exit(1); } 파일의 끝을 검사하기 위해 feof()함수가 사용되며, 0인 동안 loop계속 printf("학번 이름 중간 기말 리포트 출석 \n"); while(!feof(fp)) fscanf(fp, "%10s %8s %3d %3d %3d %3d\n", no, name, &mid, &term, &rep, &att); printf("%-10s %-8s %4d %4d %4d %4d", no, name, mid, term, rep, att); } fclose(fp); 파일에 저장된 자료의 형식에 맞게 입력형식을 지정해야 함 화면에 출력하기 위해 출력 형식을 지정
순차파일의 레코드 추가 레코드 추가를 위한 사용 모드 a a+ ab ab+ 형식 : fp=fopen(“파일명”, “a”); 사용 예 : fp=fopen(“sample.dat”, “a”); 기능 : 이미 만들어진 순차파일의 끝에 새로운 레코드 추가(append)
레코드 추가의 사용 예 #include <stdio.h> void main() { FILE *fp; fp=fopen("sample4.dat", "a"); fputs("Cho DS\n", fp); fputs("Han JK\n", fp); fputs("Kang MH\n", fp); fclose(fp); } sample4.dat 파일이 없으므로sample4.dat 파일을 생성하고 세 개의 이름을 기록하게 된다 sample4.dat에 레코드 추가 모드로 파일 개방 추가할 문자열을 파일에 쓴다
랜덤파일 처리 파일의 임의의 위치에서 자료를 읽거나 쓸 수 있다 레코드의 길이가 일정 단점 : 기억공간 낭비 순차파일에 비해 단점 : 기억공간 낭비 장점 : 레코드 검색이 빠르고 효과적
랜덤파일 열기 fopen("파일 이름", "wb") fopen("파일 이름", "rb") 2진 모드의 특징 텍스트 파일보다 적은 기억공간 레코드의 길이를 프로그래머가 결정 파일 포인터의 위치 변경 가능