Portál AbcLinuxu, 10. května 2025 00:06

Dotaz: porovnavani souboru

3.5.2005 19:47 Bobr
porovnavani souboru
Přečteno: 87×
Odpovědět | Admin
Dobry den, predelavam jeden program na linux a potreboval bych poradit jak porovnavat 2 binarni soubory v C.Chtel bych pouzit fce fread a pak memcmp pro porovnani bufferu. Sice jsem neco zkousel ale vzdy neuspesne. Pokousel jsem se i neco vyguglit ale taky neuspesne. Volat externi program (diff) take nemohu pac pozdeji budu muset program prekompilovat i na windows. Dekuji vsem za rady. S pozdravem Bobrik
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

3.5.2005 19:51 Michal Kubeček
Rozbalit Rozbalit vše Re: porovnavani souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ach jo. To je jako házet hrách na stěnu. Co jste zkoušel? Co to znamená neúspěšně?
3.5.2005 19:59 Bobr
Rozbalit Rozbalit vše Re: porovnavani souboru
  #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);
   }
  }
Yin avatar 3.5.2005 20:11 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
Rozbalit Rozbalit vše Re: porovnavani souboru
#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;
  }
}
Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.
3.5.2005 20:25 Michal Kubeček
Rozbalit Rozbalit vše Re: porovnavani souboru
V tom porovnání byste jako třetí argument 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)

Yin avatar 3.5.2005 20:35 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
Rozbalit Rozbalit vše Re: porovnavani souboru
dobry postreh... ale aby som uplne chapal... ak zmenim poradie tych dvoch, precita sa naraz 1-krat 'kus dat' o dlzke BUF_SIZE.. ak nie bude sa citat BUF_SIZE-krat 'kus dat' o dlzke 1?
Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.
3.5.2005 20:39 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: porovnavani souboru
Glibc to čte stejně po čtyřech kilech (resp. asi po PAGE_SIZE) :-)
3.5.2005 20:46 Michal Marek (twofish) | skóre: 55 | blog: { display: blog; } | Praha
Rozbalit Rozbalit vše Re: porovnavani souboru
Hledat se mi to teď nechce, prostě
info '(libc)Stream Buffering'
Yin avatar 3.5.2005 20:30 Yin | skóre: 39 | blog: Yinotopia | Slovesnko, Košice
Rozbalit Rozbalit vše Re: porovnavani souboru
hned na zaciatku by si mohol urobit 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;
}
Nikdy nie je tak zle, aby to jeden poharik nemohol ešte zhorsiť.
3.5.2005 20:00 Bobr
Rozbalit Rozbalit vše Re: porovnavani souboru
Stale to i 2 stejne soubory, vyhodi jako jine
3.5.2005 21:54 Bobr
Rozbalit Rozbalit vše Re: porovnavani souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Tak uz se mi to s pomoci vas vsech povedlo naprogramovat.Prikladam sem jeste cely kod pokud by nekdo jiny resil stejny problem. Jeste jednou vam vsem velice dekuji za pomoc. Bobrik.
#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;
}

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.