의료프로그래밍실습 의료공학과이기영 1 Chap. 11 파일입출력 2 1
이장의목표 텍스트파일의입출력방법을익힌다. (284 쪽그림참조 ) 3 C 언어의파일종류 텍스트파일 (text file) 사람들이읽을수있는문자들을저장하고있는파일 텍스트파일에서 한줄의끝 을나타내는표현은파일이읽어들여질때, C 내부의방식으로변환된다. 이진파일 (binary file) : 자료형그대로의바이트수로연속해서저장 모든데이터는있는그대로바이트의연속으로저장 이진파일을이용하여메모리에저장된변수값형태그대로파일에저장할수있다. 4 2
파일열기 (287 쪽 ) 함수 fopen() FILE *fopen(const char *filename, const char *mode); const char *filename: 파일명에대한포인터 const char *mode: 모드로파일을여는형식 실패하면 NULL을반환한다. 예1 FILE *fp; fp = fopen( i: C_Program CH6 text.txt", "r"); if (fp == NULL) printf(" 파일열기오류 n"); 예2 fp = fopen("outdata.txt", "w"); // 파일에써넣을때 fp = fopen("outdata.txt", r"); // 파일에서읽을때 5 fopen 모드 (287 쪽두번째표참조 ) 모드 "r" 읽기전용으로연다 내용 "w" "a" "r+" "w+" "a+" "rb" "wb" "ab" "rb+" "wb+" "ab+" 쓰기전용으로연다. 파일이없으면새로생성하고이미존재하면그파일내용을삭제추가용으로연다. 파일이없으면새로생성한다. 이미존재하는파일을읽기쓰기 ( 갱신 ) 용으로연다. 파일을생성하고갱신용으로연다. 파일을추가용, 갱신용으로연다. 파일이없으면새로생성한다. 이진파일을읽기용으로연다. 이진파일을쓰기용으로연다. 이진파일을추가용으로연다. 파일이없으면새로생성한다. 이미존재하는이진파일을갱신용으로연다. 이진파일을생성하고갱신용으로연다. 이진파일을추가용, 갱신용으로연다. 파일이없으면새로생성한다. 6 3
파일닫기 파일을열어서사용한후에는파일을닫아야한다. int fclose(file *fp ); fp는 fopen 함수에서받았던포인터 닫기에성공하면 0, 오류일때는 EOF( -1) 를리턴한다. 예 FILE *fp; fp = fopen("outdata.txt", "w"); // 파일에써넣을때 fclose(fp); 7 파일입출력함수 표준입출력함수 getchar() putchar() gets() puts() scanf() printf() 표준파일입출력함수 fgetc(), getc() fputc(), putc() fgets() fputs() fscanf() fprintf() 기능 문자단위로입력하는함수 (EOF 반환 ) 문자단위로출력하는함수 (EOF 반환 ) 문자열을입력하는함수 (NULL 반환 ) 문자열을출력하는함수 (NULL 반환 ) 자료형에따라자료를입력하는함수 (EOF 반환 ) 자료형에따라자료를출력하는함수 (EOF 반환 ) 8 4
C 언어로화면에쓰기. char name[40]; int number=0; printf( 이름쓰기 : "); scanf( %s,name); // or gets(name); // 키보드로쓰기 printf("%s n", name); // 모니터에쓰기 9 C 언어로텍스트파일을만들기. FILE *fp; char name[40]; int number=0; if ((fp = fopen( name.txt","w")) == NULL) // 파일쓰기로열기 printf(" n 파일열기실패!"); return; printf( 이름쓰기 : "); scanf( %s,name); // or gets(name); // 키보드로쓰기 fprintf(fp, "%s n", name); // 파일에쓰기 fclose(fp); // 파일닫기 10 5
C 언어로텍스트파일읽기. FILE *fp; char name[40]; int number=0; if ((fp = fopen( name.txt", r")) == NULL) // 파일읽기로열기 printf(" n 파일열기실패!"); return; fscanf(fp, %s,name); // or fgets(fp,name); // 파일에서읽기 printf(" 이름은 %s n", name); // 모니터에쓰기 fclose(fp); // 파일닫기 11 숫자를텍스트파일로작성 1. 5인의키를 cm 단위로텍스트파일에써넣기 1 메모장으로쓰기와동일 2. 이 5개의키를인쇄해보자. 3. 키데이터들의평균을구해보자. 4. 2와 3과정의결과를파일로작성. 5. 5의결과를1에작성한파일에덧붙여보자. Tall.txt 파일내용 165 173 169 183 175 Tall.txt 파일내용 165 173 169 183 175 평균 = 174.0 12 6
파일처리순서 1. 파일포인터선언 : FILE *fp* fp; 2. 파일열기 : fopen() 3. 파일읽기 / 쓰기 : fscanf(), fprintf() 4. 파일닫기 : fclose() 13 방법 1 초기치입력한키들의평균내기 int i, sum=0, tall[n] = 180,170,175,190,155; // 초기치입력 sum+=tall[i]; // 합구하기 ave=(float)sum/n; // 평균구하기 printf(" 평균키는 %.1f n", ave); 14 7
방법 1 키들과이들의평균파일에쓰기 int i, sum=0, tall[n]=180,170,175,190,155; // 초기치입력 FILE *fp; if ((fp = fopen("tall-1.txt","w")) == NULL) // 쓰는모드 ( 용도 ) 로파일열기 printf(" n 파일열기실패!"); return; fprintf(fp, "%d n",tall[i]); sum+=tall[i]; // 파일에쓰고, 합구하기 ave=(float)sum/n; // 평균구하기 fprintf(fp," 평균키는 %.1f n", ave); fclose(fp); 15 방법 1 초기치입력한키들의평균내기 int i, sum=0, tall[n] = 180,170,175,190,155; // 초기치입력 sum+=tall[i]; // 합구하기 ave=(float)sum/n; // 평균구하기 printf(" 평균키는 %.1f n", ave); 16 8
방법 2 키보드입력한키들의평균 int i, sum=0, tall[n]; printf("%d번키는 : ", i+1); // 프롬프트 scanf("%d", &tall[i]); // 키보드로읽기 sum+=tall[i]; // 합구하기 ave=(float)sum/n; printf(" 평균키는 %.1f n", ave); 17 방법 2 키들을파일에서읽기 int i, sum=0, tall[n]; FILE *fp; if ((fp = fopen( tall-1.txt", r")) == NULL) printf(" n 파일열기실패!"); return; fscanf(fp,"%d", &tall[i]); // 파일에서읽기 sum+=tall[i]; // 합구하기 printf( %d n,tall[i]); fclose(fp); ave=(float)sum/n; printf(" 평균키는 %.1f n", ave); 18 9
방법 2 키들을파일에서읽어평균구하고다시그파일에첨가하여써넣기 int i, sum=0, tall[n]; FILE *fp; if ((fp = fopen("tall-1.txt", "r")) == NULL) printf(" n 파일열기실패!"); return; fscanf(fp,"%d", &tall[i]); // 파일에서 sum+=tall[i]; // 합구하기 printf( %d n,tall[i]); fclose(fp); ave=(float)sum/n; printf(" 평균키는 %.1f n", ave); if ((fp = fopen("tall-1.txt", "a")) == NULL) printf(" n 파일열기실패!"); return; fprintf(fp," 평균키는 %.1f n", ave); fclose(fp); 19 발표 : 팀과제 (1) 10 명의이름과체중파일로작성하기 (#define N 10) (2) 파일에서읽고스크린에인쇄하기 (3) 합과평균값파일에첨가하여붙이기 (4) 내림 / 올림차순소팅하기 NameWgt.txt 파일내용 홍길동 65 며르치 73 이소서 69 박명수 83 화장품 75 NameWgt.txt 덧붙인파일내용 홍길동 65 며르치 73 이소서 69 박명수 83 화장품 75 체중의합은 *** 체중의평균은 ***.** 20 10
#define N 10 FILE *rp, *ap; // 파일포인터 char name[n][10];// 문자열 int i, sum, wgt[n]; // 체중 float average; // File open : 파일열기 if((rp=fopen( NameWgt.txt","r")) == NULL) printf("file can't open! n"); return; // File Read : 파일읽기 fscanf(rp, "%s t", name[i]); fscanf(rp, "%d n", &wgt[i]); // File close : 파일닫기 fclose(rp); 21 // // 합계와평균계산 sum=0; sum+=wgt[i]; average=(float)sum/n; // 강제형변환 ( 자료형 ) 변수명 // File open : 파일열기 if((ap=fopen("namewgt.txt","a")) == NULL) printf("file can't open! n"); return 0; // 파일쓰기 fprintf(ap," n 체중의합은 %d 입니다. n",sum); fprintf(ap," 체중의평균은 %.2f 입니다. n",average); // 파일닫기 fclose(ap); 22 11