fread()와 fwrite()사용도중... 일..

dexaboud3의 이미지

#include<stdio.h>
 
void main(){
	FILE*fp=fopen("binary.bin","wb");
	FILE*fp2=fopen("binary.bin","rb");
 
	int i;
	int c=1;
	int count;
 
	if(fp==NULL || fp2==NULL){
		puts("파일오픈 실패!!");
		return;
	}
 
	printf("숫자: %d\n", c);
 
	count=fwrite((void*)&c,sizeof(int),1,fp);
	printf("쓴 숫자의 갯수: %d\n", count);
	//fseek(fp,SEEK_SET,0); 또는 fclose(fp);;
	count=fread((void*)&i,sizeof(int),1,fp2);
	printf("읽은 숫자 갯수: %d\n", count);
	printf("숫자: %d\n",i);
	//fclose(fp);
	fclose(fp2);
	return;
}

제가 바이너리파일에서 불러들여온 데이터가 제대로 왔는지 확인하기 위해서 만든 코드인데요.
위에 있는 주석을 해제하고 아래있는주석을 냅두면 컴파일이 잘되는데....
반대로 하면 왜 fread()함수가 읽지를 못할까요?
제가 알기로 파일위치지시자는 스트림마다 따로 있는걸로 아는데 fp스트림이 왜 fp2스트림에 영향을 끼치는 거죠? ... 너무 답답해서 올립니다...!!

peecky의 이미지

fwrite()가 님께서 의도하신 것과는 다르게 실시간으로 파일을 기록하지 않기 때문입니다.

성능 향상을 위해서 몇 바이트짜리 쓰기 요청을 매 번 수행하지 않고, 일정량 이상 버퍼에 모이길 기다리거나, 파일이 닫길 때 기록합니다.

setvbuf(), fflush() 등의 함수 설명을 읽어보시는 것도 도움이 될 겁니다.

dexaboud3의 이미지

저는 바로바로 파일에 쓸줄알았는데.....

그게 아닌것이군요... ㅠㅠ

fflush()나, fclose를 이용하니 바로 해결되었습니다!..

감사합니다

heeeesang