1、逐字节比较
最简单的比较方法。逐个字节读取文件并进行比较。
#include <stdio.h> int compare_files_byte_by_byte(const char *file1, const char *file2) { FILE *fp1 = fopen(file1, "rb"); FILE *fp2 = fopen(file2, "rb"); if (!fp1 || !fp2) { perror("Failed to open files"); return -1; } int ch1, ch2; do { ch1 = fgetc(fp1); ch2 = fgetc(fp2); if (ch1 != ch2) { fclose(fp1); fclose(fp2); return 0; // files are not the same } } while (ch1 != EOF && ch2 != EOF); fclose(fp1); fclose(fp2); return (ch1 == EOF && ch2 == EOF) ? 1 : 0; } int main() { const char *file1 = "file1.txt"; const char *file2 = "file2.txt"; int result = compare_files_byte_by_byte(file1, file2); if (result == 1) { printf("Files are identical.\n"); } else if (result == 0) { printf("Files are different.\n"); } else { printf("An error occurred.\n"); } return 0; }
2、逐行比较
将文件逐行读取并比较每一行。
#include <stdio.h> #include <string.h> #define MAX_LINE 1024 int compare_files_line_by_line(const char *file1, const char *file2) { FILE *fp1 = fopen(file1, "r"); FILE *fp2 = fopen(file2, "r"); if (!fp1 || !fp2) { perror("Failed to open files"); return -1; } char line1[MAX_LINE], line2[MAX_LINE]; while (fgets(line1, MAX_LINE, fp1) && fgets(line2, MAX_LINE, fp2)) { if (strcmp(line1, line2) != 0) { fclose(fp1); fclose(fp2); return 0; // files are not the same } } int result = (feof(fp1) && feof(fp2)) ? 1 : 0; fclose(fp1); fclose(fp2); return result; } int main() { const char *file1 = "file1.txt"; const char *file2 = "file2.txt"; int result = compare_files_line_by_line(file1, file2); if (result == 1) { printf("Files are identical.\n"); } else if (result == 0) { printf("Files are different.\n"); } else { printf("An error occurred.\n"); } return 0; }
3、通过哈希值比较
使用哈希函数计算文件的哈希值并比较它们是否相同。
#include <stdio.h> #include <openssl/md5.h> void compute_md5(FILE *file, unsigned char *result) { MD5_CTX md5_ctx; unsigned char buffer[1024]; size_t bytes; MD5_Init(&md5_ctx); while ((bytes = fread(buffer, 1, sizeof(buffer), file)) != 0) { MD5_Update(&md5_ctx, buffer, bytes); } MD5_Final(result, &md5_ctx); } int compare_files_md5(const char *file1, const char *file2) { FILE *fp1 = fopen(file1, "rb"); FILE *fp2 = fopen(file2, "rb"); if (!fp1 || !fp2) { perror("Failed to open files"); return -1; } unsigned char hash1[MD5_DIGEST_LENGTH]; unsigned char hash2[MD5_DIGEST_LENGTH]; compute_md5(fp1, hash1); compute_md5(fp2, hash2); fclose(fp1); fclose(fp2); return memcmp(hash1, hash2, MD5_DIGEST_LENGTH) == 0 ? 1 : 0; } int main() { const char *file1 = "file1.txt"; const char *file2 = "file2.txt"; int result = compare_files_md5(file1, file2); if (result == 1) { printf("Files are identical.\n"); } else if (result == 0) { printf("Files are different.\n"); } else { printf("An error occurred.\n"); } return 0; }