2015년 7월 21일 화요일

20150722 파일과 스트림, 그리고 기본적인 파일의 입출력

fopen 함수호출을 통한 파일과의 스트림 형성과 FILE 구조체

FILE *fopen(const char *filename, const char *mode);
// 성공 시 해당 파일의 FILE 구조체 변수의 주소 값, 실패 시 NULL 포인터 반환

int fclose(FILE *stream); // 성공시 0, 실패시 EOF를 반환
☆★☆반드시 fopen후에 fclose를 사용하여 스트림을 종료시켜야 리소스 소실이 없어진다!

feof 함수 기반의 파일복사 프로그램
int feof(FILE *stream); // 파일의 끝에 도달한 경우 0이 아닌 값 반환(-1로 정의된 상수)
FILE *src=fopen("src.txt", "rt"); // 복사할 파일내용 읽기
FILE *des=fopen("dst.txt", "wt"); // 복사할 위치에 쓰기
int ch; //
while((ch=fgetc(src))!=EOF){fputc(ch, des);} // 파일의 끝과 src가 같지 않을경우 반복
while(1){ch=fgetc(srt);if(EOF==ch){break;}fputc(ch, des)} // 위와 같은 결과

바이너리 데이터의 입출력 : fread(입력), fwrite(출력) ((void*)는 생략가능)
fread(주소(저장할 위치), 용량, 개수(용량x개수 만큼 read), 파일); // 리턴값은 개수 참조
size_t fread(void *buffer, xize_t size, size_t count, FILE *stream);
// 성공 시 전달인자 count, 실패 또는 파일의 끝 도달 시 count보다 작은 값 반환
int buf[12];
fread(void*)buf, sizeof(int), 12, fp); // fp는 FILE 구조체 포인터
// "sizeof(int) 크기의 데이터 12개를 fp로부터 읽어 들여서 배열 buf에 저장하라!"

fwrite
size_t fwrite(const void *buffer, xize_t size, size_t count, FILE *stream);
// 성공 시 전달인자 count, 실패 시 count보다 작은 값 반환
int buf[7]={1, 2, 3, 4, 5, 6, 7};
fwrite((void*)buf, sizeof(int), 7, fp);
// "sizeof(int) 크기의 데이터 7개를 buf로부터 읽어서 fp에 저장해라!"

★개행이 \n이 아니다!
"C 프로그램에서 \n을 파일에 저장하면 \r\n으로 변환되어 저장됨"
"파일에 저장된 \r\n을 C 프로그램상에서 읽으면 \n으로 변환되어 읽혀짐"
따라서 개행 문자의 변환을 신경 쓸 필요가 없다. 그저 텍스트 모드로 파일을 개방하면됨

☆스트림을 구분하는 기준1
데이터 READ 스트림 읽기만 가능
데이터 WRITE 스트림 쓰기만 가능
데이터 APPEND 스트림 쓰되 덧붙여 쓰기만 가능
데이터 READ/WRITE 스트림 일기, 쓰기 모두 가능

c언어는 위를 바탕으로 아래의 6가지로 스트림을 세분화

모드(mode) 스트림의 성격 파일이 없으면?
r 읽기 가능 에러
w 쓰기 가능 생성
a 파일의 끝에 덧붙여 쓰기 가능 생성
r+ 읽기/쓰기 가능 에러
w+ 읽기/쓰기 가능 생성
a+ 읽기/덧붙여 쓰기 가능 생성
위 표를 참조하여 필요로 하는 스트임의 특성과 일치하는 '파일의 개방 모드(mode)'를 선택
그리고 모드의 이름이 fopen 함수의 두 번째 인자가 된다.
★rt, rb // r뒤의 t는 텍스트 모드 b는 바이너리 모드

도스에서 (명령어) >> (파일이름) // 파일내용에 덧붙여쓰기(>하나면 덮어쓴다!)

☆스트림을 구분하는 기준2 : 텍스트 모드와 바이너리 모드
텍스트 파일(문자데이터-.txt등)과 바이너리 파일(바이너리 데이터-영상,음원파일 등)

댓글 없음:

댓글 쓰기