c언어 파일호출함수 공부를 하던중 문제가 발생했어요

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답변

  • 좋아요

    0

    싫어요
    채택취소하기

    소스코드의 목적은 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 탈출.

    리소스 정리하고 프로그램 종료입니다.

    • 명쾌한 설명 정말 감사합니다~ 앞으로도 이해가 안되는게 있으면 질문하겠습니다~ 최현수 2018.3.5 13:40

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.