Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어로 두 파일을 비교하고 불일치 위치를 보고하는 프로그램

C 프로그래밍 언어에서는 파일에 접근하여 그 안의 내용을 자유롭게 읽고 쓸 수 있습니다.

파일이란 정보를 저장할 수 있는 하나의 메모리 블록입니다. 이 글에서는 텍스트 파일만을 대상으로 다룹니다.

이번에 만들 프로그램은 두 개의 파일을 비교하여 서로 다른 부분(불일치)을 찾아 보고합니다. 두 파일은 거의 동일하지만 일부 문자가 다를 수 있으며, 프로그램은 첫 번째 불일치가 발견된 줄 번호와 해당 위치까지 함께 출력합니다.

알고리즘

1단계: 두 파일을 모두 열고 파일 포인터를 시작 위치에 둡니다.
2단계: 파일에서 데이터를 한 문자씩 순서대로 읽어옵니다.
3단계: 읽어온 두 문자를 비교합니다. 서로 다르면 해당 오류 문자의 줄 번호와 위치를 출력합니다.

예제 코드

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

void compareFiles(FILE *file1, FILE *file2) {
    char ch1 = getc(file1);
    char ch2 = getc(file2);
    int error = 0, pos = 0, line = 1;

    while (ch1 != EOF && ch2 != EOF) {
        pos++;
        if (ch1 == ' ' && ch2 == ' ') {
            line++;
            pos = 0;
        }
        if (ch1 != ch2) {
            error++;
            printf("Line Number : %d Error Position : %d ", line, pos);
        }
        ch1 = getc(file1);
        ch2 = getc(file2);
    }
    printf("Total Errors : %d ", error);
}

int main() {
    FILE *file1 = fopen("file1.txt", "r");
    FILE *file2 = fopen("file2.txt", "r");

    if (file1 == NULL || file2 == NULL) {
        printf("Error : Files not open");
        exit(0);
    }

    compareFiles(file1, file2);

    fclose(file1);
    fclose(file2);
    return 0;
}

코드 설명

compareFiles 함수는 두 파일 포인터를 매개변수로 받아 각 파일에서 getc()로 문자를 하나씩 읽습니다. pos 변수는 현재 줄에서의 문자 위치를, line 변수는 현재 줄 번호를 추적합니다. 두 문자가 모두 개행 문자( )라면 줄 번호를 1 증가시키고 위치를 0으로 초기화합니다. 문자가 서로 다르면 오류 횟수를 증가시키고 줄 번호와 위치를 화면에 출력합니다. 이 과정은 어느 한쪽 파일이 끝날 때까지(EOF) 반복되며, 마지막에는 총 오류 개수를 출력합니다.

main 함수에서는 fopen()으로 두 파일을 읽기 모드("r")로 엽니다. 만약 파일 열기에 실패하면(NULL 반환) 오류 메시지를 출력하고 프로그램을 종료합니다. 비교가 끝나면 fclose()로 파일을 닫아 리소스를 해제합니다.

출력 결과

// 파일 내용
File1 : Hello!
Welcome to tutorials Point

File2 : Hello!
Welcome to turoials point

Line number: 2 Error position: 15
Total error : 1

참고 사항

위 프로그램은 첫 번째 불일치뿐 아니라 파일 전체에서 발견된 모든 불일치를 출력하고 총 개수를 알려줍니다. 첫 번째 불일치만 필요하다면 오류를 발견한 시점에 break 문으로 반복문을 빠져나오도록 수정하면 됩니다. 또한 실무에서는 파일 크기가 다른 경우나 바이너리 파일 비교 등 더 다양한 상황을 고려해야 하므로, 목적에 맞게 로직을 확장하여 사용하는 것이 좋습니다.