파일의 개방 모드 (웬만하면 r,w,a 중에서 선택)
모드 |
스트림의 성격 |
파일이 없을 경우 |
r |
읽기 가능 |
Error |
w |
쓰기 가능 |
생성 |
a |
파일 끝에 덧붙여 쓰기 가능 |
생성 |
r+ |
읽기/쓰기 가능 |
Error |
w+ |
읽기/쓰기 가능 |
생성 |
a+ |
읽기/덧붙여 쓰기 가능 |
생성 |
1. 모드의 +는 읽기, 쓰기가 모두 가능한 스트림의 형성을 의미
2. 모드의 a는 쓰기(덧붙이기)가 가능한 스트림 형성
윈도우(\r\n), UNIX(\n), Mac(\r) 계열마다 파일 내 개행이 다르므로 형태 변환을 시켜줘야 한다.
형태 변환은 파일을 텍스트 모드(fopen사용시)로 개방하면 자동으로 됨.
C프로그램에서 \n을 파일에 저장하면 윈도우에서는 \r\n으로 변환되어 저장됨.
텍스트 모드의 파일 개방을 위해서는 fopen 함수의 두 번째 인자로 다음 중 하나 전달
rt, wt, at, r+t(rt+), w+t(wt+), a+t(at+)
바이너리 데이터를 저장하고 있는 파일의 경우 형태의 변환이 일어나면 안되므로 바이너리 모드로 파일 개방.
rb, wb, ab, r+b(rb+), w+b(wb+), a+b(ab+)
개방 모드에 아무것도 붙이지 않으면 디폴트 값은 텍스트 모드
feof함수 : 파일의 끝 확인할 때 사용
| #include <stdio.h> int feof(FILE * stream); |
|
파일의 끝에 도달한 경우 0이 아닌 값 반환
한 파일에서 다른 파일로 복사를 할 때 완전하게 파일 끝까지 복사가 다 됐는지 확인할 때 사용
fgetc나 fgets함수가 EOF를 반환했다고 해서 무조건 파일의 끝에 도달했다고 판단할 수 없다. 오류가 발생하는 경우에도 EOF가 반환
바이너리 데이터의 입출력 fread, fwrite
| #include <stdio.h> size_t fread(void * buffer, size_t size, size_t count, FILE * stream); |
|
성공시 전달인자 count, 실패 또는 파일의 끝 도달 시 count보다 작은 값 반환
| #include <stdio.h> size_t fwrite(void * buffer, size_t size, size_t count, FILE * stream); |
|
성공시 전달인자 count, 실패 시 count보다 작은 값 반환만약 fwrite((void*)but, sizeof(int), 12, fp) 이렇게 함수가 정의돼 있다면 한 번 호출할 때마다 12만큼씩 데이터를 써라..라는 뜻.. 최소 12만큼 쓰는게 아니라 그냥 무조건 12만큼 써라 라는 뜻
서식에 따른 데이터 입출력 : fprintf, fscanf
printf와 scanf 함수와 비슷, 입출력 대상이 콘솔이 아닌 파일
ex) char name[10]="홍길동";
char sex='M';
int age = 24;
fprintf(fp, "%s %c %d", name, sex, age); fp는 파일 구조체 포인터
fscanf : 첫 번째 인자로 전달된 포인터가 지칭하는 파일로부터 데이터를 읽어들임
ex) char name[10];
char sex ;
int age;
fscanf(fp, "%s %c %d", name, &sex, &age);