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!
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.
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.
Wenn die Dateien binär sind, verwenden Sie memcmp nicht strcmp, da \ 0 möglicherweise als Daten angezeigt wird.
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.
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.
Tags und Links c++