본문 바로가기
C

파일입출력(바이너리,fwrite fread fopen fclose )

by 코드덕후 2022. 8. 31.
728x90


fread 함수 원형

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
ptr : 저장할 버퍼
size : 읽어올 데이터 크기
count : 읽어올 데이터 갯수
stream : 읽어올 파일 스트림(파일포인터)

fwite 함수 원형
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
ptr : 읽어올 버퍼
size : 파일 스트림에 기록할 데이터 크기
count : 기록할 데이터 갯수
stream : 기록할 파일 스트림(파일포인터)


각각 함수의 원형은 위와 같습니다.
저장이나 읽기가 제대로 성공했다면 각 함수는 성공한 개수를 반환값으로 반환합니다.

 

예제로 정수데이터를 저장하고 읽어서 출력해보고 구조체의 데이터도 저장하고 읽어보겠습니다.

소스에 주석으로 설명도 해놓았으니 궁금한 점은 댓글로 달아주세요

 

5개의 int데이터를 저장해서 읽은후 화면에 출력하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

int main(void)
{
	//< 파일 저장을 위한 구조체
	int writeArr[5] = { 1,2,3,4,5};

	//< 데이터 저장
	FILE* fp = fopen("test.bin", "wb");

	if (fp == NULL)
	{
		puts("file write open error");
		return 0;
	}

	size_t size = fwrite(writeArr, sizeof(int), 5, fp);
	if (size != 0)
	{
		printf("%lld file write ok\n", size);
	}

	fclose(fp);

	//< 데이터 로딩
	int readArr[5];

	//< 데이터 저장
	fp = fopen("test.bin", "rb");

	if (!fp)
	{
		puts("file read open error");
		return 0;
	}

	size = fread(readArr, sizeof(int), 5, fp);
	if (size != 0)
	{
		printf("%lld file read ok\n", size);
	}

	fclose(fp);
	//< 데이터 출력
	for (int i = 0; i < 5; i++)
	{
		printf("%d\t", readArr[i]);
	}
	return 0;
}

저장된 test.bin파일의 파일 내용입니다.

이렇게 바이너리 형태로 저장된 파일을 다시 읽어서 출력하면 아래와 같이 정상적으로 출력이 됩니다.

 

출력결과

 

100개의 구조체 데이터 생성해서 저장하고 읽어서 화면에 출력하기

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

typedef struct data
{
	int		id;
	char	name[10];
}DATA;

#define DATACNT 100
int main(void)
{
	//< 파일 저장을 위한 구조체
	DATA warr[DATACNT];

	//< 데이터 생성
	for (int i = 0; i < DATACNT; i++)
	{
		sprintf(warr[i].name, "테스트%03d", i);
		warr[i].id = i;
	}

	//< 데이터 저장
	FILE* fp = fopen("test.bin", "wb");

	if (fp == NULL)
	{
		puts("file write open error");
		return 0;
	}

	size_t size = fwrite(warr, sizeof(DATA), DATACNT, fp);
	if (size != 0)
	{
		printf("%lld file write ok\n", size);
	}

	fclose(fp);

	//< 데이터 로딩
	DATA readArr[DATACNT];

	//< 데이터 저장
	fp = fopen("test.bin", "rb");

	if (!fp)
	{
		puts("file read open error");
		return 0;
	}

	size = fread(readArr, sizeof(DATA), DATACNT, fp);
	if (size != 0)
	{
		printf("%lld file read ok\n",size);
	}

	fclose(fp);
	//< 데이터 출력
	for (int i = 0; i < DATACNT; i++)
	{
		printf("id : %d , name : %s\t", readArr[i].id, readArr[i].name);
	}
	
	return 0;
}

구조체형태로 저장한 바이너리 파일의 내부 모습니다.

데이터가 조금 깨진거 처럼 보이는 이유가 바로 바이너리 형태로 저장했기 때문입니다.

 

이렇게 저장된 데이터를 읽어들여서 출력한 모습니다.

 

출력결과

 

이렇게 바이너리 형태로 저장해봤습니다. 파일의 이름을 test.txt로 바꾸고 wb로 되어있는곳을 wt로 만 바꾸면

텍스트파일형태로 저장하고 로딩합니다.

 

파일입출력은 어렵지 않으니 해보다 보면 금방 이해가 가실거에요.

궁금한 점은 댓글로 알려주시구요

 

728x90
반응형
LIST

댓글