파일 입출력
파일 입출력
데이터 입출력을 위해서는 스트림이 형성되어야 한다.
아래의 코드처럼 FILE* fopen(파일의 경로 / 스트림의 종류(읽기용 쓰기용 / 바이너리 텍스트파일)mode)사용됩니다.
FILE* fopen(const char *filename, const char *mode);
fopen 함수는 스트림의 생성 요청
fclose 함수는 스트림의 소멸 요청
fopen함수를 사용하면 fclose사용을 꼭 해야한다.
그렇지 않으면 메모리 누수 현상이 일어난다.
파일의 개방 모드
아래는 스트림의 모드이다.
모드(mode) | 스트림의 성격 | 파일이 없을때 |
r | 읽기 가능 | 에러 |
w | 쓰기 가능 | 생성 |
a | 파일의 끝에 덧붙여 쓰기 가능 | 생성 |
r+ | 읽기 / 쓰기 가능 | 에러 |
w+ | 읽기 / 쓰기 가능 | 생성 |
a+ | 읽기 / 덧붙여 쓰기 가능 | 생성 |
아래와 같이 조합하여 스트림의 형태를 결정할 수 있다.
FILE* file1 = fopen("text.txt", "wt"); // 텍스트 쓰기 모드 스트림생성
FILE* file2 = fopen("text.txt", "rt"); // 텍스트 읽기 모드 스트림생성
FILE* file3 = fopen("text.txt", "wb"); // 바이너리 쓰기 모드 스트림생성
FILE* file3 = fopen("text.txt", "rb"); // 바이너리 읽기 모드 스트림생성
파일 입출력 함수들
아래의 함수들은 FILE구조체의 포인터를 인자로 전달하여 파일을
대상으로 입출력을 할 수 있는 함수들이다.
int fputc(int c, FILE* stream); // 문자 출력
int fgetc(FILE* stream); // 문자 입력
int fputs(const char* s, FILE* stream); // 문자열 출력
char* fgets(char* s, int n, FILE* stream); // 문자열 입력
feof : 파일의 끝을 확인하는 함수
파일의 끝에 도달한 경우 0이 아닌 값 반환
파일 입력함수는 오류가 발생하는 경우에도 EOF를 반환한다.
따라서 feof는 EOF의 반환원일을 확인하기 위한 함수이다.
0이 아니면 파일의 끝에 도달한 것이고, 그 외에 경우는 오류가 발생한 경우이다.
int feof(FILE* stream);
fread : 바이너리 데이터 읽기
바이너리 데이터를 파일에서 읽을 때 사용되는 함수
성공 시 전달인자 count, 실패 또는 파일의 끝 도달 시 count보다 작은 값 반환
size_t fread(void* buffer, size_t size, size_t count, FILE* stream);
fwrite : 바이너리 데이터 쓰기
바이너리 데이터를 파일에 쓸 때 사용되는 함수
성공 시 전달인자 count, 실패 시 count보다 작은 값 반환
size_t fwrite(const void* buffer, size_t size, size_t count, FILE* stream);
fprintf
파일에 데이터를 쓰는 용도의 함수입니다.
함수원형은 아래의 코드와 같다.
성공적으로 데이터를 쓴 경우 문자 수를 반환하며, 실패한 경우
음수 값을 반환합니다.
int fprintf(FILE* stream, const char* format, ...);
fscanf
파일에서 데이터를 읽어오는 용도의 함수입니다.
함수원형은 아래의 코드와 같다.
성공적으로 데이터를 읽은 경우 문자 수를 반환하며, 실패한 경우
EOF(End-Of-File)를 반환합니다.
int fscanf(FILE* stream, const char* format, ...);
Text / Binary 의 잡합체인 구조체 변수 입출력
fprintf()함수 와 fscanf()함수를 사용하여 구조체 변수를
파일에 쓰거나 파일에서 읽어올 수 있다.
아래의 스트림 모드로 구조체 변수를 Text / Binary형태로 입출력 할 수 있다.
- wt : 텍스트 쓰기
- rt : 텍스트 읽기
- wb : 바이너리 쓰기
- rb : 바이너리 읽기
파일 위치 지시자
파일 위치 지시자는 파일 내에서 현재 위치를 나타내는 값입니다.
파일 위치 지시자는 파일 입출력 함수 fseek(), ftell()와 함께 사용됩니다.
fseek : 파일 위치 지시자 이동
파일 위치 지시자의 참조 위치를 변경시킨다.
성공적으로 파일 위치 지시자를 이동시키면 0을 반환하고,
실패하면 EOF(End-Of-File)를 반환합니다.
- SEEK_SET : 파일의 처음 위치
- SEEK_END : 파일의 마지막 위치
- SEEK_CUR : 파일의 현재 위치
int fseek(FILE* stream, long offset, int whereFrom); // 파일 위치 지시자의 참조 위치를 변경
ftell : 현재 파일 위치 지시자의 위치
현재 파일 위치자의 위치 정보를 반환해준다.
파일 위치 지시자의 현재 위치를 나타내는 값으로,
long타입으로 반환됩니다. 실패하면 -1을 반환합니다.
long ftell(FILE* stream); // 파일 위치 지시자의 취지 정보 반환