반응형
하나의 파일을 다른 이름의 파일로 복사하는 프로그램을 작성하라. 이진 파일이라고 가정하고 fread()와 fwrite()를 사용한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | #include <stdio.h> #include <stdlib.h> #define SIZE 100 int main(void) { FILE *fpr=NULL; FILE *fpw=NULL; char buff[SIZE]; int count=0; if((fpr=fopen("first.bin","rb"))==NULL) { printf("잘못된 파일 열기1\n"); exit(1); } if((fpw=fopen("second.bin","wb"))==NULL) { printf("잘못된 파일 열기2\n"); exit(1); } while((count=(fread(buff,sizeof(char),SIZE,fpr)))!=0) { printf("%d",count); //몇 개 세었는지 보려고 fwrite(buff,sizeof(char),count,fpw); } return 0; } | cs |
buff 와 fread 나 fwrite 를 쓸 때 덩어리의 크기를 int로 하면 오류가 생길 수 있습니다. 중간에 잘리는 경우(예를들어 09에서 0과 9사이에서 잘리는 경우)
데이터가 손실되는 것을 경험하였습니다. 따라서 1byte 단위인 char로 하는 것이 가장 안전합니다. (촘촘이 자르는 것이 가장 안전하겠죠??)
예를들어 int 형으로 한다면
1000100 을 복사하면 앞의 1000만 복사가 됩니다. 뒤에 100은 덩어리 (4byte) 가 꽉 안차서 손실이 되는 것 같아요 (정확한 것 아님 결과로부터 추론한 것임 (출력값은 1이됨)
정확한 것을 아시는 분은 댓글로 달아주세요)
그런데 10001000 을 하면 10001000 이 복사되고 출력값은 2가됩니다. 따라서 덩어리를 다 채워줘야 하는 것 같습니다.
반응형