c언어 파일호출함수 공부를 하던중 문제가 발생했어요
조회수 1383회
include
int main(void) { FILE * src=fopen("src.bin","rb"); FILE * des=fopen("des.bin","wb"); char buf[20]; int readcnt;
if(src==NULL || des==NULL)
{
puts("파일오픈 실패!");
return -1;
}
while(1)
{
readcnt=fread((void*)buf,1,sizeof(buf),src);
if(readcnt<sizeof(buf))
{
if(feof(src)!=0)
{
fwrite((void)*buf,1,readcnt,des);
puts("파일복사 완료!");
break;
}
else
puts("파일복사 실패!");
break;
}
fwrite((void)*buf,1,sizeof(buf),des);
}
fclose(src);
fclose(des);
return 0;
}
while함수내에 파일복사를 이룬다음 EOF에 도달했을때요 fwrite((void)*buf,1,readcnt,des)를 삽입하는 이유가 buf의 크기만큼 복사되지 않았기 때문에 남은 바이트의 크기를 채우기 위해서 넣는 소스인것이라 하는데요 전혀 이해가 안되서 그런데 설명해주실 수 있나요?
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
소스코드의 목적은 src.bin에서 일정크기씩 복사해서 des.bin에 순차적으로 저장을 해서 같은 파일을 한벌 더 만드는 겁니다.
말 그대로 복사작업을 하는 겁니다.
src.bin 이 110 이라고 가정합시다.
그리고 일정 크기씩 복사해야 하니
char buf[20];
20짜리 공간을 생성합니다.while(1) // break 를 만날때까지 반복함 { readcnt=fread((void*)buf,1,sizeof(buf),src);
readcnt=fread((void*)buf,1,sizeof(buf),src);
에 의해 src.bin에서 앞에서부터 buf 크기만큼 잘라서 buf에 저장합니다. 그리고 readcnt 는 실제 src.bin에서 읽은크기입니다.그렇게 buf에 저장된 것을
fwrite((void)*buf,1,sizeof(buf),des);
을 통해 실제 des.bin에 씁니다.즉 src.bin의 크기가 110 이므로 5번 반복하면서 100까지 쓸것이고 6번째 반복할 때 readcnt는 10이 됩니다. 20, 40, 60, 80, 100 씩 저장한겁니다. 그리고 6번째에서는 src.bin 크기가 110 이므로 마지막 10만큼만 읽게 됩니다. (스트림이라는 것을 따로 공부하면 이해하기 더 좋습니다.)
if(readcnt<sizeof(buf)) { if(feof(src)!=0) { fwrite((void)*buf,1,readcnt,des); puts("파일복사 완료!"); break; }
이제 이해가 안된다는 부분인데 위의 설명을 이해했으면 간단합니다.
readcnt가 buf크기인 20보다 작으면 즉 제일 마지막 반복이면 수행하는 겁니다.
마지막 10크기의 buf를 저장하고 break 로 while 탈출.
리소스 정리하고 프로그램 종료입니다.
댓글 입력