Dateien vergleichen
-
Hallo zusammen!
Ich schreibe ein Programm, dass gleiche Dateien im in einem Verzeichnis finden sollte. Sollte.... Ich hab schon eine weile im Forum gesucht und auch Beiträge gefunden. Ich kann mir aber momentan nicht erklären, warum die Funktion die ich geschrieben hab, nicht funktioniert

Zur Erklärung: Node ist eine Klasse in der Name und die Größe der Datei gespeichert sind. Node deswegen, weil ich einen Binärbaum zum suchen verwende.
Das Problem ist, das die Funktion nicht funktioniert... Kann mir einer von euch sagen, woran das liegt?
bool SearchEngine::compareFiles(Node* newNode, Node* oldNode) { wifstream oldNodeStream; wifstream newNodeStream; vector<TCHAR> newNodeContent(COMPARESIZE); vector<TCHAR> oldNodeContent(COMPARESIZE); newNodeStream.open(newNode->getName().c_str(),ios::binary); oldNodeStream.open(oldNode->getName().c_str(),ios::binary); int position = 0; while(newNodeStream) { newNodeStream.read(&newNodeContent[0],COMPARESIZE); oldNodeStream.read(&oldNodeContent[0],COMPARESIZE); position += COMPARESIZE; newNodeStream.seekg(position); oldNodeStream.seekg(position); printf("Position: %d\n", position); if (!wmemcmp(&newNodeContent[0],&oldNodeContent[0],newNodeStream.gcount() != 0)){ newNodeStream.close(); oldNodeStream.close(); return false; } } newNodeStream.close(); oldNodeStream.close(); return true; }
-
Weil sie z.B. nicht berücktsichtigt, dass die Dateien ungleich groß sind!
Der seekg ist überflüssig.
Ist das eine binäre Datei? Mir ist nicht klar warum Du explizit UNICODE verwendest aber einen TCHAR Datenpuffer verwendest. Da der Puffer sowieso statisch ist, würde ich den auf dem Stack anlegen, dass ist weitaus einfacher und effektiver.
-
die zeile
if (!wmemcmp(&newNodeContent[0],&oldNodeContent[0],newNodeStream.gcount() != 0)){
sollte wohl mal prüfen ob die inhalte unterschiedlich sind indem man den rückgabewert mit 0 vergleicht. Jetzt ist noch eine Negierung hinzugekommen, das ist doppelt gemoppelt. vermutlich vergleicht die funktion eh keine zeichen miteinander da der hintere teil (ein boolscher wert) in 0 umgenwandelt wird.
-
Oki, danke für den Tip. Habe aber immer noch ein Problem... Ich finde leider nicht alle gleichen Dateien

Kann es an dem ios::binary liegen? Ich denke nicht, oder? Ich möchte beliebige Dateitypen vergleichen.
bool SearchEngine::compareFiles(Node* newNode, Node* oldNode) { wifstream oldNodeStream; wifstream newNodeStream; vector<TCHAR> newNodeContent(COMPARESIZE); vector<TCHAR> oldNodeContent(COMPARESIZE); newNodeStream.open(newNode->getName().c_str(),ios::binary); oldNodeStream.open(oldNode->getName().c_str(),ios::binary); while(!newNodeStream.eof()) { newNodeStream.read(&newNodeContent[0],COMPARESIZE); oldNodeStream.read(&oldNodeContent[0],COMPARESIZE); if (wmemcmp(&newNodeContent[0],&oldNodeContent[0],newNodeStream.gcount()!=0)){ newNodeStream.close(); oldNodeStream.close(); return false; } } newNodeStream.close(); oldNodeStream.close(); return true; }
-
Ich hatte es schon mal gefragt:
Martin Richter schrieb:
Weil sie z.B. nicht berücktsichtigt, dass die Dateien ungleich groß sind!
Ist das eine binäre Datei? Mir ist nicht klar warum Du explizit UNICODE verwendest aber einen TCHAR Datenpuffer verwendest.Was ist den in den Puffern drin?
Was sagt der Debugger?
Wo sind die Dateien denn unterschiedlich?
-
Hallo...
Also die Dateien sind immer gleich groß. Das ist eine Voraussetzung damit die Funktion aufgerufen wird. Was ich nicht verstehe ist folgendes: Hab grad den Parameter COMPARESIZE kleiner gemacht um beim Debuggen eine bessere Übersich zu haben... Dann hab ich das Programm laufen lassen und festgestellt, dass ich weniger Paare als vorher hab... Wenn ich den Parameter größer mache, dann werden es immer mehr gleiche Dateien?????? Versteht das einer?????
Edit:
Okay, ändern wir mal die Zeile:
if (wmemcmp(&newNodeContent[0],&oldNodeContent[0],newNodeStream.gcount())!=0)Falsche Klammerung... Finde zwar immer noch nicht alle Paare, aber jetzt kann ich woanders suchen....
-
Technische Punkte:
-> die close()-Aufrufe sind auf jeden Fall überflüssig - der fstream-Dtor schließt die Datei schon selber.
-> die Mischung aus TCHAR (generischer Zeichentyp) und wchar_t (immer Wide-Character) ist auf jeden Fall zweifelhaft. Entscheide dich bitte für einen Zeichentyp, den du dann durchgängig verwendest.
-> von der Tatsache abgesehen, daß ein vector<> nur unnötigen Ballast mitschleppt, finde ich die Art, wie du vector'en verwendest, zumindest unsicher (das kratzt stark am Rand des ANSI-Standards) - für deine Zwecke reichen zwei wchar_t-Arrays völlig aus
(hab' ich das wirklich gerade gesagt?)Ansonsten solltest du mal überprüfen, daß alle Größenangaben stimmen - ich bin mir nicht 100% sicher, ob alle beteiligten Funktionen ihre Größenwerte in wchar_t-Einheiten angeben/erwarten (wenn da jemand mit Byte-Größen arbeitet, hast du ein Problem).