Vergleiche zwei Dateien

7

Ich versuche eine Funktion zu schreiben, die den Inhalt von zwei Dateien vergleicht.

Ich möchte, dass es 1 zurückgibt, wenn die Dateien gleich sind, und 0, wenn sie unterschiedlich sind.

ch1 und ch2 arbeitet als Puffer, und ich habe fgets verwendet, um den Inhalt meiner Dateien zu erhalten.

Ich denke, mit dem eof Zeiger stimmt etwas nicht, aber ich bin mir nicht sicher. FILE Variablen werden in der Befehlszeile angegeben.

P.S. Es funktioniert mit kleinen Dateien mit einer Größe unter 64 KB, aber nicht mit größeren Dateien (700 MB Filme zum Beispiel oder 5 MB. MP3-Dateien).

Irgendwelche Ideen, wie man es ausarbeitet?

%Vor%

EDIT: Ich habe diese Funktion mit der Aufnahme Ihrer Antworten verbessert. Aber es wird nur der erste Puffer nur verglichen - & gt; aber mit einer Ausnahme - & gt; Ich habe herausgefunden, dass es aufhört, die Datei zu lesen, bis sie 1A Zeichen erreicht (angehängte Datei). Wie können wir es zum Laufen bringen?

EDIT2: Aufgabe gelöst (Arbeitscode angehängt). Danke an alle für die Hilfe!

    
Christoph 28.05.2011, 18:28
quelle

6 Antworten

8

Da Sie Ihre Arrays auf dem Stack zugewiesen haben, werden sie mit zufälligen Werten gefüllt ... sie werden nicht auf Null gesetzt.

Zweitens wird strcmp nur mit dem ersten NULL-Wert verglichen, der sich, wenn es sich um eine Binärdatei handelt, nicht unbedingt am Ende der Datei befindet. Daher sollten Sie memcmp in Ihren Puffern verwenden. Aber auch dies wird zu unvorhersehbaren Ergebnissen führen, da Ihre Puffer auf dem Stack zugewiesen wurden. Selbst wenn Sie also mit Dateien vergleichen, die gleich sind, ist das Ende der Puffer hinter dem EOF möglicherweise nicht identisch, also memcmp meldet weiterhin falsche Ergebnisse (dh es wird höchstwahrscheinlich gemeldet, dass die Dateien nicht identisch sind, wenn sie aufgrund der zufälligen Werte am Ende der Puffer nach dem EOF der jeweiligen Datei vorhanden sind).

Um dieses Problem zu umgehen, sollten Sie zuerst die Länge der Datei messen, indem Sie zuerst die Datei durchlaufen und sehen, wie lange die Datei in Bytes ist, und dann malloc oder calloc verwenden, um die Puffer zuzuweisen Vergleichen und füllen Sie diese Puffer mit dem Inhalt der Datei. Dann sollten Sie in der Lage sein, einen gültigen Vergleich der binären Inhalte jeder Datei durchzuführen. Sie können zu diesem Zeitpunkt auch mit Dateien arbeiten, die größer als 64 KB sind, da Sie die Puffer zur Laufzeit dynamisch zuweisen.

    
Jason 28.05.2011, 18:31
quelle
8

Wenn Sie ein wenig Geschwindigkeit aufgeben können, ist hier ein C ++ Weg, der wenig Code benötigt:

%Vor%

Indem Sie istreambuf_iterators verwenden, schieben Sie die Auswahl der Puffergröße, das tatsächliche Lesen und die Verfolgung von eof in die Standardbibliotheksimplementierung. std::equal gibt zurück, wenn der erste Konflikt auftritt, also sollte dieser nicht länger als nötig ausgeführt werden.

Dies ist langsamer als Linux cmp , aber es ist sehr einfach zu lesen.

    
mtrw 01.06.2016 17:42
quelle
7

Wenn die Dateien binär sind, verwenden Sie memcmp nicht strcmp, da \ 0 möglicherweise als Daten angezeigt wird.

    
George Kastrinis 28.05.2011 18:30
quelle
7

Hier ist eine C ++ Lösung. Es scheint angemessen, da Ihre Frage als C++ markiert ist. Das Programm verwendet ifstream anstelle von FILE* . Es zeigt Ihnen auch, wie Sie in einem Dateistream suchen, um die Größe einer Datei zu bestimmen. Schließlich liest es Blöcke von 4096 gleichzeitig, so dass große Dateien wie erwartet verarbeitet werden.

%Vor%     
jww 01.05.2014 02:40
quelle
3

Verwenden Sie besser fread und memcmp , um \ 0 Zeichenprobleme zu vermeiden. Außerdem sollten die !feof -Kontrollen wirklich || sein anstelle von & amp; & amp; da es eine kleine Chance gibt, dass eine Datei größer als die andere ist und die kleinere Datei durch Ihre Puffergröße teilbar ist.

%Vor%     
Switch 28.05.2011 23:03
quelle
2

Switch-Code sieht gut aus für mich, aber wenn Sie eine genaue wollen     Zum Vergleich müssen die while-Bedingung und die Rückgabe geändert werden:

%Vor%     
RobisonMD 25.10.2011 19:43
quelle

Tags und Links