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 문으로 반복문을 빠져나오도록 수정하면 됩니다. 또한 실무에서는 파일 크기가 다른 경우나 바이너리 파일 비교 등 더 다양한 상황을 고려해야 하므로, 목적에 맞게 로직을 확장하여 사용하는 것이 좋습니다.