Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- 게임제작
- 스펙주도형개발
- 파일패킹
- VR플랫폼
- 5G에그
- 게임
- 클린 아키텍처
- 캐시 메모리 사상
- 게임은 문화
- 유니티
- 게임개발
- VR
- 동적 힙
- linux
- js
- 2D
- handtracking
- MacFilter
- 온라인
- C언어
- 캐스팅연산자
- PHOTON
- DAIVerse
- Unity
- PointableCanvasModule
- C++
- TCP
- 바이브코딩
- OculusInteractionSamplesRayCanvas
- 메모리
Archives
- Today
- Total
kunyoungparkk
[C/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.11.07 |