카테고리 없음

fread, fwrite (바이너리 데이터 입출력)

zuyo 2019. 5. 8. 22:26
반응형

1. 바이너리 데이터 읽기

size_t fread(void* buffer, size_t size, size_t count, FILE* stream);

// buffer : 읽어 온 데이터를 담을 버퍼
// size : 버퍼 요소 하나의 크기 (char형 배열이면 1바이트)
// count : 한번에 읽을 버퍼의 사이즈 (배열 사이즈)
// stream : 읽어 올 파일 or 스트림

2번째 인자와 3번째 인자의 곱의 바이트 크기만큼 데이터를 읽는다.
읽어들인 데이터의 갯수를 반환한다 (파일의 끝에 도달하거나 오류 발생시, 3번째 인자보다 작은 값이 반환된다)


2. 바이너리 데이터 쓰기

size_t fwrite(void* buffer, size_t size, size_t count, FILE* stream);

// buffer : 쓸 데이터가 저장되어 있는 버퍼
// size : 버퍼 요소 하나의 크기
// count : 한번에 쓸 버퍼의 사이즈
// stream : 데이터를 써서 저장할 파일 or 스트림.


예시)

int main()
{
	FILE* src = fopen("image.jpg", "rb");
	FILE* dst = fopen("copy_image.jpg", "wb");

	char buf[50000];
	int size;

	if (src == NULL || dst == NULL)
		puts("파일 오픈 실패");

	while (1)
	{
		size = fread(buf, 1, sizeof(buf), src); // 버퍼 사이즈만큼 데이터 읽기. 읽어들인 데이터 사이즈 반환

		// 버퍼 사이즈보다 적게 읽어왔을 때
		if (size < sizeof(buf))
		{
			if (feof(src) != 0) // 파일의 끝에 도달했던 경우
			{
				fwrite(buf, 1, size, dst); // 가져온 사이즈 만큼 쓰기
				puts("파일 복사 완료");
				break; 
			}
			else // 오류
				puts("파일 복사 실패");
			break;
		}

		// 딱 버퍼 사이즈만큼 읽어왔을 때
		fwrite(buf, 1, sizeof(buf), dst); // 버퍼 사이즈 만큼 데이터 쓰기
	}

	fclose(src);
	fclose(dst);
}

반응형