Portál AbcLinuxu, 10. května 2025 00:06
#define BLOCK_SIZE 1024 char block1[BLOCK_SIZE]; char block2[BLOCK_SIZE]; FILE *fr1, *fr2; int readed; int same_file = 0; fr1= fopen(config_file,"rb"); fr2= fopen("temp_config_bin","rb"); while( ((readed = fread(block1, sizeof(char), BLOCK_SIZE, fr1) ) == BLOCK_SIZE) ){ if( fread(block2, sizeof(char), BLOCK_SIZE, fr2) == BLOCK_SIZE ){ if( memcmp(block1, block2, BLOCK_SIZE) != 0 ){ same_file = 1; } } else { same_file = 1; if(ferror(fr2) != 0) printf("%s: error: can't read file temp_config_bin !\n", prog_name); } }
#define BUF_SIZE 1024
FILE *fr1, *fr2;
char buf1[BUF_SIZE], buf2[BUF_SIZE];
size_t rs1, rs2;
int same_files = 1;
fr1 = fopen...
fr2 = fopen...
while(!(feof(fr1) || feof(fr2))) {
rs1 = fread(buf1, sizeof(char), BUF_SIZE, fr1);
rs2 = fread(buf2, sizeof(char), BUF_SIZE, fr2);
if(rs1 != rs2 || memcmp(buf1, buf2, BUF_SIZE) != 0) {
same_files = 0;
break;
}
}
memcmp
měl použít rs1
(nebo rs2
), jinak budete u posledního bloku (není-li délka souboru násobkem BUF_SIZE
) porovnávat i části bufferů, do kterých se nic nenačetlo. Pokud bude poslední blok zároveň prvním (délka souborů stejná a menší než BUF_SIZE
), může se stát, že váš program označí stejné soubory za různé.
P.S. sizeof(char)
je vždy 1, je to definováno normou; a z hlediska efektivity bude vhodnější fread(buf1, BUF_SIZE, 1, fr1)
než fread(buf1, 1, BUF_SIZE, fr1)
info '(libc)Stream Buffering'
stat()
na tie dve subory, zistit ich velkosti a porovnat ich. A taktiez by si mohol z struct stat
vytiahnut velkost bloku suboru na danom fs a tym (mozno aj rapidne) urychlit citanie.
#import <sys/stat.h>
struct stat sb1, sb2;
size_t buf_size;
stat(filename1, &sb1);
stat(filename2, &bs2);
if(sb1.st_size == sb2.st_size) {
buf_size = sb1.st_blksize;
// dynamicky alokovat buf a buf2, napr. cez alloca()
// zvysok codu (fopen, while, fclose)
} else {
same_files = 0;
}
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(int argc, char *argv[]) { FILE *fr1, *fr2; char *buf1, *buf2; size_t rs1, rs2; int same_files = 1; struct stat sb1, sb2; size_t buf_size; stat("file1.txt", &sb1); stat("file2.txt", &sb2); if(sb1.st_size == sb2.st_size) { buf_size = sb1.st_size; buf1= alloca(buf_size); buf2= alloca(buf_size); fr1 = fopen("file1.txt","rb"); fr2 = fopen("file2.txt","rb"); while(!(feof(fr1) || feof(fr2))) { rs1 = fread(buf1, sizeof(char), buf_size, fr1); rs2 = fread(buf2, sizeof(char), buf_size, fr2); if(rs1 != rs2 || memcmp(buf1, buf2, buf_size) != 0) { same_files = 0; break; } } fclose(fr1); fclose(fr2); } else { same_files= 0; printf("Size is not the same.\n"); system("PAUSE"); exit(0); } same_files?printf("The file is not different\n"):printf("The file is different\n"); system("PAUSE"); return 0; }
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.