Code Archive/C언어

Step15. 파일 입출력

쌍큐 2014. 9. 12. 13:06

- binary(b)와 텍스트(t) 파일로 나누어서 접근

- 파일 접근 write(w), read(r), add(a)


- 파일 모드는 파일 접근방식과 타입에 따라 다르다

  •    텍스트 읽기 전용 = "rt"
  •    텍스트 쓰기 전용 = "wt"
  •    텍스트 추가 전용 = "at"
  •    이진파일 읽기 전용 = "rb"
  •    이진파일 쓰기 전용 = "wb"
  •    이진파일 추가 전용 = "ab"


- binary 타입은 메모리에 저장되있는 것 그대로 파일에 저장

- 텍스트 타입은 변수에 있는 내용을 텍스트로 저장


- 파일 접근 패턴


//파일 구조체 생성

FILE *file;

//파일 연결

file = fopen("경로","파일 모드"); 

//파일 입출력 실시

fprintf(파일 구조체,"내용",파일에 넣을 변수);

fprintf(file,"%d %s",123,"ㅋㅋㅋ");

fwrite(변수 주소,크기,넣을 개수,파일구조체);

fwrite(&p,sizeof(p),2,f);

fread(변수,읽어올 크기,읽어올 횟수,파일구조체);

fread(&s,sizeof(person),1,r);

//파일 닫기

fclose(파일구조체);


예제1> 성적구조체 배열을 이진파일로 저장

#include <stdio.h>

struct Subject{

int score;

char title[20];

};

void main(){

//과목들을 저장할 배열

Subject s[4];

//과목 점수 입력

int i;

for(i=0;i<4;i++){

printf("%d번째 과목명과 점수를 입력 하세요 : ",i+1);

scanf("%s %d",s[i].title, &s[i].score);

}

//파일 저장 부분

FILE *file;

file = fopen("c:\\test\\subject.obj","wb");

fwrite(s,sizeof(Subject),4,file);

fclose(file);

}


예제2> 이진 파일에 있는 성적을 읽은 후 텍스트 파일에 성적표 출력

#include <stdio.h>

#include <stdlib.h>

struct Subject{

int score;

char title[20];

};

void main(){

double sum=0.0;

int i;

Subject s[4];

FILE *file;

file = fopen("c:\\test\\subject.obj","rb");

fread(s,sizeof(Subject),4,file);

fclose(file);

file = fopen("c:\\test\\subjectMat.txt","wt");

fprintf(file,"================================\n");

fprintf(file,"%10s %5s %5s\n","과목명","점수","등급");

fprintf(file,"================================\n");

for(i=0;i<4;i++){

sum += s[i].score;

char ch;

//등급 처리

switch(s[i].score/10){

case 10:

case 9:

ch = 'A';

break;

case 8:

ch = 'B';

break;

case 7:

ch = 'C';

break;

case 6:

ch = 'D';

break;

default:

ch = 'F';

}

fprintf(file,"%9s %6d %4c\n",s[i].title,s[i].score,ch);

}

fprintf(file,"================================\n");

fprintf(file,"평균 : %lf\n",sum/i);

fprintf(file,"================================\n");

fclose(file);


}