• 카테고리

    질문 & 답변
  • 세부 분야

    프로그래밍 언어

  • 해결 여부

    해결됨

(10:57) 바이너리 함수의 데이터 내용

22.11.16 08:01 작성 조회수 320

0




안녕하세요. 강의 13.5 10: 57 부근에 대한 질문입니다.
교수님께서 강의를 진행하시는 대로 그대로 코드를 작성하고 실행하였으나,
0부터 144짜지 2의 간격으로 깔끔하게 출력되던 교수님의 결과창과 달리 제 출력 결과는 마치 주소값을 나타내듯 불규칙한 -값의 연속, 그리고 중간중간 0과 정수 등이 섞여있는 결과를 보여주었습니다.

바이너리 파일이 2진 데이터 그대로의 파일이기 때문에, 파일 내부에 어떠한 값이 들어있을지는 출력해보기 전까지 모르고
또 출력되더라도 다른 컴퓨터의 결과와 완전히 동일한 결과가 출력되지 않을 수 있는 것이 정상인가요?

혹시 제가 코드를 잘못 작성했는지 비교해보았으나 그런 것 같지는 않습니다.

답변 1

답변을 작성해보세요.

1

강민철님의 프로필

강민철

2022.11.17

코드를 다시 살펴보시겠어요?

실수가 될 법한 포인트들을 짚어드리자면,

 

  1. 우선 아래의 코드가 제대로 작성되었는지 확인해보세요. parr 안에 값이 잘 대입되었는지 디버깅해보시거나 printf로 확인해보셔도 좋습니다.

	for (int n = 0; n < 123; ++n) {
		*(parr + n) = n * 2;
		// printf("%d ", *(parr + n));
	}

 

  1. fwrite의 첫 번째 인자는 &parr가 아닌 parr입니다.

    	fwrite(&d, sizeof(d), 1, fp);
    	fwrite(&n, sizeof(n), 1, fp);
    	fwrite(parr, sizeof(int), n, fp);
  2. 아래와 같이 출력되었는지 확인해보세요.

	for (int i = 0; i < n; i++)
		printf("%d ", *(parr + i));
	printf("\n");

 

 

혹은 아래의 코드를 그대로 돌려보셔도 좋습니다.

 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

int main(){
{
	FILE * fp = fopen("binary_file", "wb");
	double d = 1.0 / 3.0;
	int n = 123;
	int * parr = (int *)malloc(sizeof(int) * n);
	if (!parr) exit(1);
	
	for (int n = 0; n < 123; ++n) {
		*(parr + n) = n * 2;
		// printf("%d ", *(parr + n));
	}

	fwrite(&d, sizeof(d), 1, fp);
	fwrite(&n, sizeof(n), 1, fp);
	fwrite(parr, sizeof(int), n, fp);

	fclose(fp);
	free(parr);
}
{
	FILE * fp = fopen("binary_file", "rb");
	double d;
	int n = 0;

	fread(&d, sizeof(d), 1, fp);
	fread(&n, sizeof(n), 1, fp);

	int * parr = (int *)malloc(sizeof(int) * n);
	if (!parr) exit(1);

	fread(parr, sizeof(int), n, fp);

	for (int i = 0; i < n; i++)
		printf("%d ", *(parr + i));
	printf("\n");

}

	return 0;
}