[C/C++] 파일 입출력
2022. 1. 6. 13:52ㆍC++
C언어에서는 fopen / fopen_s 함수로 파일을 열고, fclose 함수로 파일을 닫음.
파일을 열 때 파일접근(읽기/쓰기/추가), 입출력모드(텍스트 모드 / 바이너리 모드)를 선택해야한다.
모드 | 설명 |
r | 읽기 전용으로 파일을 오픈. 파일이 없다면 호출 실패. NULL 반환. |
w | 쓰기 전용으로 파일을 오픈 파일이 있다면 기존 파일을 지우고 새로 만듬. 파일이 없다면 새로 만듬. |
a | 추가 쓰기 전용으로 파일을 오픈. 파일이 있다면 파일의 끝에서부터 내용을 추가한다. 파일이 없다면 새로 만듬. |
r+ | 읽고 쓰기 위해 파일을 오픈. 파일이 있다면 기존의 내용을 덮어씀. 파일이 없다면 파일을 새로 만듬. |
w+ | 읽고 쓰기 위해 파일을 오픈. 파일이 있는 경우 기존 파일을 지우고 새로 만듬. 파일이 없다면 파일을 새로 만듬. |
a+ | 읽고 추가 쓰기 위해 파일을 오픈. 파일이 있다면 파일의 끝에서부터 내용을 추가한다. 파일이 없다면 파일을 새로 만듬. |
모드 | 설명 |
t (텍스트) | 윈도우에서 텍스트 문서를 만들면 개행문자를 0D, 0A로 처리한다. 다른 시스템과 C언어에서는 개행 문자를 0A로 처리한다. 텍스트 모드로 텍스트 파일을 열면 0D를 제외한 상태로 파일을 열기 때문에 좀 더 편하게 작업할 수 있다. 숫자가 아스키코드 문자열의 형태로 저장된다. |
b (바이너리) | 원본 파일 그대로 파일을 연다. 숫자가 메모리의 내용 그대로 기록된다. |
C언어에서 파일 저장은 직접 rewind 함수를 호출하여 저장할 수도 있고,
파일을 닫거나 일정 크기가 버퍼에 쌓이면 자동으로 저장이 된다.
파일 읽기/쓰기
로그 작성시에 주로 fprintf 함수를 이용하여 작성한다.
데이터를 로드할경우 fread / fwrite를 이용하여 파일 전체 혹은 구조체 단위로 한번에 파일을 읽고 쓴다.
(I/O 횟수가 줄어들어서 성능이 좋다.)
//////////////파일 읽기//////////////////
FILE * fp;
char * fileContent;
int fileSize;
//파일 열기
fopen_s(&fp, "fileName", "rb");
//파일 크기 찾기
fseek(fp, 0, SEEK_END);
fileSize = ftell(fp);
fseek(fp, 0, SEEK_SET);
//해당 파일 내용을 담을 곳 동적 할당
fileContent = (char*)malloc(fileSize);
//읽기
fread_s(fileContent, fileSize, 1, fileSize, fp);
////////////파일 쓰기/////////////
//구조체
struct Data
{
int a;
int b;
};
//구조체 통째로 파일에 작성
FILE * fp;
fopen_s(&fp, "fileName", "wb");
Data d = {1, 2};
fwrite(&d, 1, sizeof(d), fp);
이 때 주의점은, 텍스트 모드로 열었을 때 ftell 함수로 파일 크기를 찾으면 개행문자가 0D0A로 처리가 된다.
그런데 막상 fread로 읽을 때는 개행문자가 0A로 처리가 되어서, 실제 파일 크기가 개행문자 수만큼 적어진다.
그래서 텍스트 모드로 파일을 읽을 때 fread를 써야한다면, 파일 내용을 메모리에 저장한 후에,
순회하면서 개행문자 수만큼 파일 크기를 저장한 변수에서 빼줘야 한다.
'C++' 카테고리의 다른 글
비트맵(.bmp) 파일 구조 (0) | 2022.01.06 |
---|---|
[C/C++] 파일 패킹 (0) | 2022.01.06 |
C언어 문자열 처리 (0) | 2022.01.06 |
C/C++ 시간을 측정하기 (0) | 2022.01.06 |
호출 규약 (0) | 2021.10.25 |