반응형

하나의 파일을 다른 이름의 파일로 복사하는 프로그램을 작성하라. 이진 파일이라고 가정하고 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가됩니다. 따라서 덩어리를 다 채워줘야 하는 것 같습니다.






반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

텍스트 파일 비교  (0) 2017.02.11
fgets 함수  (0) 2017.02.11
대문자로 변경  (0) 2017.01.31
텍스트 파일 비교  (0) 2017.01.31
암호화와 복호화  (0) 2017.01.16
반응형

정수 배열A[]를 다른 정수 배열 B[]에 복사하는 함수를 작성하고 테스트하라.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#define SIZE 5
void array_copy(int *A, int *B, int size);
int main(void)
{
    int a[SIZE]={5,4,2,3,100};
    int b[SIZE]={0};
    int i;
    array_copy(a,b,SIZE);
    for(i=0;i<SIZE;i++)
        printf("%d ", b[i]);
    printf("\n");
    return 0;
}
void array_copy(int *A, int *B, int size)
{
int i;
for(i=0;i<size;i++)
    *(B+i)=*(A+i);  //B[i]=A[i];
}
cs




반응형

'컴퓨터 & 프로그래밍 & 전자공학 > C언어' 카테고리의 다른 글

월급의 총액  (0) 2016.08.15
기본급과 보너스  (0) 2016.08.15
학점과 점수  (0) 2016.08.15
배열 출력  (0) 2016.08.15
배열과 포인터  (0) 2016.08.15

+ Recent posts