zwei dateien miteinander vergleichen
-
hallo,
ich möchte zwei dateien mit ihrem inhalt vergleichen. wie kann man das machen??
vieleicht mit der funktion "strcmp"? weiß aber nicht wie man die funktion für den vergleich mit zwei dateien einsetzen kann.vielen dank
daniel
-
Du musst erstmal beide Dateien einlesen. Dann kannst du es vergleichen mit strcmp(). Noch besser wäre vielleicht, wenn du die Dateien zeilenweise einliest und die Zeilen dann jeweils vergleichst.
-
@AJ,
ich stimme dir zu. Nur würde ich nicht Zeilenweise arbeiten.
Eine solche Funktion sollte ja schnell sein und wird durch
die Suche nach dem Zeilenende nur gebremst.
Also entweder komplett einlesen (bei kleinen Dateien zu empfehlen)
oder Blockweise um Arbeitsspeicher zu sparen.Bye Peter.
-
moin,
danke für die anregungen aber könntet ihr mir ein wenig code zur verfügung stellen?vielen dank
daniel
-
@peter
Stimmt, es gibt noch performantere Lösungen. Am schnellsten wärs natürlich, wenn man jedes einzelne Zeichen mit fgetc() einliest und vergleicht.@Daniel
Wo genau liegt das Problem? Weißt du nicht wie man Dateien öffnet, ausliest, schließt, ... oder weißt du nicht wie man Strings mit strcmp() vergleicht?
-
Hallo,
liess in Bloecken von je 1024 Byte (oder wieviel du eben lesen moechtest. 512 oder
1024 sind in der Regel ok) und vergleiche sie mittels memcmp();.mfg
v R
-
naja, irgendwie habe ich schon probleme mit dem code. vieleicht könnte einer ein paar zweilen code beifügen.
vielen dank
daniel
-
Schau Dir mal diff an. Das ist genau das, was Du suchst...
-
danke dir,
gibts das aber auch für windows plattformen????
mfg daniel
-
der vorschlag von virtuell Realisticer war doch ziemlich gut
ungetestet so ins forum gehackt
int flag=1,x,y; FILE *fp1,*fp2; char buffer1[1024]; char buffer2[1024]; char filename1[]="test.abc" char filename2[]="test2.abc" fp1=fopen(filename1,"rb"); fp2=fopen(filename2,"rb"); while(!feof(fp1)&&!foef(fp2)&&flag){ x=fread(buffer1,1,1024,fp1); y=fread(buffer2,1,1024,fp2); if(x-y)flag=0;else flag=!memcmp(buffer1,buffer2,1024); } flcose(fp1); fclose(fp2); if(flag) //dateien gleich else //dateien nicht gleich
-
Windalf schrieb:
if(x-y)flag=0;else flag=!memcmp(buffer1,buffer2,1024);
*lol* (das x-y ist echt genial)
ich wuerde das so schreiben:
if(x!=y || memcmp(buffer1, buffer2, x)) break;
-
@Shade Of Mine
das ist so ne macke die man sich angwöhnt wenn man manchmal versucht eine funktion zu schreiben die eine aufgabe mit möglichst wenig ascii-zeichen zu verwenden.
auf www.cplusplus-forum.de haben wir so ne rätselecke wo ein gewisser Oxdeadbeef das sogenannte C-golfen eingeführt hat. es wird irgend ne aufgabe gestellt und der die mit den wenigsten ascii-zeichen löst gewinnt. Ist manchmal erstaunlich was man so alles mit 100 Asciizeichen für funktionalität darstellen kann. (Nur vestehen kanns der lesende dann kaum noch)
hmm das hast du ja gleich nen bug bei mir rausgeschossen der mir spontan gar nicht aufgefallen ist. kommt davon wenn man direkt ins forum postet
die version mit der veroderung ist allerdings elegantergreetz Windalf
-
vielen dank an alle die was geschrieben haben. nach dem programm von Windalf
und der verbesserung von Shade Of Mine funzt das richtig gut. besten dankdaniel
-
Windalf schrieb:
@Shade Of Mine
das ist so ne macke die man sich angwöhnt wenn man manchmal versucht eine funktion zu schreiben die eine aufgabe mit möglichst wenig ascii-zeichen zu verwenden.
auf www.cplusplus-forum.de haben wir so ne rätselecke wo ein gewisser Oxdeadbeef das sogenannte C-golfen eingeführt hat. es wird irgend ne aufgabe gestellt und der die mit den wenigsten ascii-zeichen löst gewinnt. Ist manchmal erstaunlich was man so alles mit 100 Asciizeichen für funktionalität darstellen kann. (Nur vestehen kanns der lesende dann kaum noch)
sowas ist natuerlich hin und wieder lustig, ich wuerde das aber nicht zu exzessiv machen - denn das verdirbt den stil gewaltig (wie du unschwer an dem if(x-y) erkennen kannst)