반응형

두개의 텍스트 파일을 비교하여 같은지 다른지를 알려주는 프로그램을 작성하라.


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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <stdio.h>
#include <stdlib.h>
#define SIZE 100
#define DEBUG 0
void open_file(FILE **fp1, FILE **fp2);
void check(FILE *fp1, FILE *fp2);
int main(void)
{
    FILE *fp1=NULL;
    FILE *fp2=NULL;
    int quit=0;
    while(1)
    {
    open_file(&fp1,&fp2);
    check(fp1,fp2);
    fseek(fp1,0,SEEK_SET);
    fseek(fp2,0,SEEK_SET);
    printf("종료하려면 9999 계속하려면 1\n");
    scanf("%d",&quit);
    if(quit==9999)
        break;
    getchar();
    }
    return 0;
}
void open_file(FILE **fp1, FILE **fp2)
{
    char name1[SIZE];
    char name2[SIZE];
    printf("첫번째 파일 이름: ");
    gets(name1);
    printf("두번째 파일 이름: ");
    gets(name2);
    if((*fp1=fopen(name1,"r"))==NULL)
    {
        printf("파일오픈불가능1\n");
        exit(1);
    }
    if((*fp2=fopen(name2,"r"))==NULL)
    {
        printf("파일오픈불가능2\n");
        exit(1);
    }
}
void check(FILE *fp1, FILE *fp2)
{
    char a,b;
    while(1)
    {
        a=fgetc(fp1);
        b=fgetc(fp2);
        #if DEBUG==1
        printf("%d %d\n", a,b);
        #endif
        if((feof(fp1)!=0&&feof(fp2)==0)||(feof(fp1)==0&&feof(fp2)!=0))
        {
            printf("두 파일은 서로 다릅니다(길이다름).\n");
            break;
        }
        if(a!=b)
        {
            printf("두 파일은 서로 다릅니다(글자다름).\n");
            break;
        }
        if(feof(fp1)!=0&&feof(fp2)!=0)
        {
            printf("두 파일은 서로 같습니다.\n");
            break;
        }
    }
}
cs



먼저 이중포인터를 사용한 이유는 fp1, fp2 자체가 파일을 가리키는 포인터죠. 따라서 처음에 초기값으로

NULL을 가리키고 있으니까 포인터가 가리키는 주소를 바꿔주려면 이중포인터를 사용해야해서 그렇습니다.

두번째로 중요한 것은 check 함수인데요. 여기서 '글자다름' 파트를 '길이다름' 파트보다 먼저 쓰게되면

무조건 다른 것이 글자다름으로 나오게 됩니다. 왜냐하면 텍스트 파일에서 EOF(파일의 끝)은 -1 값을

반환하게 되는데요 이것을 비교했을 때 글자다름을 먼저 수행하게 되면 무조건 -1과는 다른 값이 되므로

(길이가 다르기 때문에 다른 한쪽은 문자일 것이므로 어떠한 정수값을 가질 것임) 글자다름

으로 출력이 됩니다. 따라서 길이다름을 먼저 해주어야 길이가 다를 때는 길이다름으로 출력을 할 수 있습니다.

이것은 눈으로 확인할 수 있게 #if 로 표시를 해놓았습니다. 눈으로 확인하고 싶으시면 DEBUG 값을 1로 바꾸세요.

아래 스크린샷에도 추가해 놓았습니다.

파일 실행하기전 txt 파일로 아래와 같이 생성한 후에 시작해야합니다. (r타입으로 읽기 때문에)



이와같이 텍스트 파일에서는 파일의 끝이 -1로 표현되기 때문에 꼭 길이다름을 먼저 판별해 주어야 한다.

아니면 무조건 글자다름으로만 나온다. (길이가 다를 경우 -1은 무조건 다른 파일의 남은 글자와 다를테니까)




반응형

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

파일 복사  (0) 2017.01.31
대문자로 변경  (0) 2017.01.31
암호화와 복호화  (0) 2017.01.16
대소문자 변경  (0) 2017.01.16
정수 비트 이동  (0) 2017.01.16

+ Recent posts