easy software

C언어 두개의 파일이 같은지를 검사해보자 본문

C언어/FILE IO

C언어 두개의 파일이 같은지를 검사해보자

JAVA 웹개발자 2015. 2. 28. 22:58

이번 글에서는 파일 입출력 함수들을 이용한 간단한 예제를 소개해 드리겠습니다.

 

제목과 동일하게 파일 두개가 같은지를 검사하는 프로그램입니다.

 

두개의 텍스트 파일이 있으면, 공백하나까지 모두 같아야 같은 파일이라고 안내해 줘야 합니다.

 

만약 띄어쓰기 하나라도 다르다면, 다른 파일이라고 안내해야 합니다.

 

실행 파일의 이름이 comp.exe이고 비교대상의 파일이 mystory.txt 와 mystory2.txt 이면

 

아래와 같이 실행되어야 합니다.

 

 

실행의 예

 

C:\test>comp mystroy.txt mystory2.txt

두 개의 파일은 일치합니다.

 

 

프로그램의 코드는 생각보다 무척 간단합니다.

 

코드를 보고난 후에 설명드리겠습니다.

 

 

 

#include <stdio.h>

 

//문자열을 입력받기 위해 main에 매개변수를 정해줌
int main(int argc, char** argv){
     FILE* fp1;
     FILE* fp2;
     int state1, state2;
     char a, b;

 

     //사용자가 입력을 잘못할 경우에 오류발생
     if (argc != 3){
          printf("[실행파일이름 텍스트파일이름 텍스트파일이름] 형식으로 입력하세요.\n");
          return 1;
     }

 

     //사용자가 입력한 이름의 텍스트 파일을
     //rt모드로 스트림 생성
     fp1 = fopen(argv[1], "rt");
     fp2 = fopen(argv[2], "rt");

 

     /* fopen함수는 오류발생시 NULL을 리턴하므로
     파일 개방 중 오류발생시 프로그램을 종료 */
     if (fp1 == NULL || fp2 == NULL){
          printf("스트림 생성시 오류발생\n");
          return 1;
     }

 

     // 두개의 파일에 저장된 데이터를 비교함
     while (1){
          //두개의 파일 모두 끝에 도달하지 않을 경우
          if (feof(fp1) == 0 && feof(fp2) == 0){
               a = fgetc(fp1);
               b = fgetc(fp2);

 

               if (a != b){
                    printf("두개의 파일은 일치하지 않습니다.\n");
                    break;
               }
          }

 

          //하나의 파일만 끝에 도달할 경우
          else if (feof(fp1) != 0 && feof(fp2) == 0){
               printf("두개의 파일은 일치하지 않습니다.\n");
               break;
          }

 

          //하나의 파일만 끝에 도달할 경우
          else if (feof(fp1) == 0 && feof(fp2) != 0){
               printf("두개의 파일은 일치하지 않습니다.\n");
               break;
          }

 

          //두개의 파일 모두 끝에 도달한 경우.
          //(첫 번째 조건문에서 각 파일의 문자는 검사했기 때문에
          //두 파일이 동시에 feof에 의해 탈출하면 동일한 파일인 것)
          else{
               printf("두개의 파일은 일치합니다.\n");
               break;
          }
     }

 

     /* fclose함수는 종료시 오류가 발생하면
     0이 아닌 다른값을 리턴하므로 비정상 종료로 판단되면
     안내후 프로그램을 종료 */
     state1 = fclose(fp1);
     state2 = fclose(fp2);
     if (state1 != 0 || state2 != 0){
          printf("스트림 제거시 오류발생\n");
          return 1;
     }

 

     return 0;
}

 

 

주석이 너무 잘 작성되어 있어서 코드 설명은 간단히 드리겠습니다.

 

처음에 사용자가 입력한 텍스트 파일과의 스트림을 생성합니다.

 

이후에는 feof함수와 각종 조건문을 통해서 파일안에 저장된 데이터가 같은지 비교합니다.

 

만약에, 두 파일모두 끝에 도달하지 않았다면, fgetc를 이용하여 데이터를 변수에 저장하고,

 

그 변수들을 비교하여 데이터가 같은지 확인합니다.

 

두개의 파일중에 하나의 파일만 먼저 종료될 경우에는,

 

저장된 데이터가 다르다는 의미이므로 일치하지 않다는 문구가 출력됩니다.

 

만약 동시에 두개의 파일이 모두 종료된다면, 이미 첫번째 조건문에서

 

데이터가 같다는 점은 비교하였기 때문에, 일치함을 출력해 줍니다.

 

 

아래는 실제 실행화면입니다. 참고해서 보시기 바랍니다.

 

 

 

두개의 텍스트 파일이 같은 경우

 

 

 

 

 

 

 

 

두개의 텍스트 파일이 다른 경우(mystory.txt 중간에 엔터키를 입력했음)

 

 

 

 

 

Comments