[C/C++] 파일 입출력

2022. 1. 6. 13:52C&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&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.11.07