2 Dateien vergleichen (zeilenweise)
-
So wird das nichts - was hat denn das rewind() mitten in der Schleife zu suchen? (du kannst nicht einfach willkürlich Befehle zusammenbauen und dann hoffen, daß etwas ordentliches dabei rauskommt)
Mal ein Ansatz:
while(fgets(orig,LEN,orig_file)) { rewind(cmp_file); while(fgets(cmp,LEN,cmp_file)) { if(strcmp(orig,cmp)==0) ...//gefunden } }
-
also ich glaube da ist gerade ein verständnisproblem. ich glaub ich hab das nicht gut geschildert.
also ich habe eine datei mit meinetwegen 100 zeilen.
und eine datei mit 5 zeilen.
jetzt will ich die 100-zeilen-datei durchgehen von oben nach unten und schauen ob die 5-zeilendatei darin enthalten ist. wenn sie in zeile 20 - 25 drin ist, soll er natürlich weitergehen und schauen ob sie nochmal vorhanden ist. solange bis die 100-zeilen-datei keine zeilen mehr zum einlesen hat.mit der lösung findet er jede zeile 5x. sooft, wie meine 5-zeilendatei groß ist.
-
Na in dem Fall mußt du in der inneren Schleife auch beide Dateien auslesen. (eine Idee wäre es noch, die kleinere Datei einmal komplett einzulesen und dann nur noch mit den neu reinkommenden Zeilen zu vergleichen)
Am besten überlegst du dir erstmal auf dem Papier, was du in welcher Reihenfolge einlesen und vergleichen willst, um zu einem Ergebnis zu kommen.
-
also entweder ich hab einen knoten im kopf oder ich verwechsel was.
ich kann doch per while-schleife die große datei einlesen.
dann lese ich die kleine datei ein und schaue ob die zeile passt. das mache ich solange wie ich zeilen in der kleinen datei habe. und dann setze ich mit rewind() den zeiger zurück.wie geht es denn die komplette datei einzulesen und dann zu schauen? das wäre doch deutliche fehlerrobuster oder?
-
manu1984 schrieb:
ich kann doch per while-schleife die große datei einlesen.
dann lese ich die kleine datei ein und schaue ob die zeile passt. das mache ich solange wie ich zeilen in der kleinen datei habe. und dann setze ich mit rewind() den zeiger zurück.Na das ist doch ein Anfang - jetzt mußt du das nur noch in C++ Code übertragen (das ergibt vermutlich zwei verschachtelte while-Schleifen - und eventuell mußt du die größere Datei auch gelegentlich etwas zurückdrehen, um einen Anfang für die nächste Runde zu haben).
wie geht es denn die komplette datei einzulesen und dann zu schauen? das wäre doch deutliche fehlerrobuster oder?
Du legst dir (zur Not dynamisch) ein entsprechend großes char*-Array an und liest dort die kleine Datei rein. Dann brauchst du nur noch eine Datei zeilenweise einlesen und mit dem Inhalt dieses Arrays zu vergleichen.
-
ja aber wenn ich 2 while-schleifen nehmen kann, dann kann ich doch auch eine while und eine if nehmen, oder?
die while läuft einfach die orig-datei durch und die if- schaut ob die 2 zeilen gleich sind.
oder klappt das nicht?
-
Ja, könntest du eventuell - aber dann mußt du noch besser aufpassen, was du da eigentlich machst. Also lass es lieber
PS: Ich zitiere mich zwar ungern selber, aber:
CStoll schrieb:
Am besten überlegst du dir erstmal auf dem Papier, was du in welcher Reihenfolge einlesen und vergleichen willst, um zu einem Ergebnis zu kommen.
-
ja das hab ich doch schon. da meine möglichkeiten ja aber in c-programmieren echt geschränkt sind *g* ist das leider das beste was ich so zu tage bringe.
und im großen und ganzen klappt es ja. wenn er nicht immer mal irgendwelchen mist sucht.
-
manu1984 schrieb:
...wie geht es denn die komplette datei einzulesen und dann zu schauen? das wäre doch deutliche fehlerrobuster oder?
Ich würde mich bei Deiner Aufgabe überhauptnicht mit zeilenweisem Einlesen und dann Vergleichen beschäftigen, 'ne 100 Zeilen-Datei ist winzig, man kann Binary-Modus wählen, beide Dateien in zwei Puffer einlesen, die Vergleiche mit memcmp() durchführen.
z.B.#include <stdio.h> #include <stdlib.h> #include <string.h> int main() { FILE* fptr1 = fopen("c:\\aaa.txt", "rb"); FILE* fptr2 = fopen("c:\\bbb.txt", "rb"); int gefunden = 0, len1, len2; char* buf1, *buf2; fseek(fptr1, 0, SEEK_END), fseek(fptr2, 0, SEEK_END); len1 = ftell(fptr1), len2 = ftell(fptr2); buf1 = malloc(len1), buf2 = malloc(len2); fseek(fptr1, 0, SEEK_SET), fseek(fptr2, 0, SEEK_SET); fread(buf1, 1, len1, fptr1), fread(buf2, 1, len2, fptr2); _fcloseall(); for (int i = 0; i < (len2-len1); i++) if (!memcmp(buf1, (buf2+i), len1)){ gefunden++; i += len1-1; } free(buf1), free(buf2); return 0; }
:xmas1:
-
Das Problem mit dem in Buffer einlesen ist nur, dass die eine Datei wirklich nur ungefähr 20 zeilen lang ist. die andere jedoch ist teilweise 500.000 zeilen lang.
-
Mit Windows XP z.B. mal für kurze Zeit 100 MB und mehr! Speicher anzufordern und zu bekommen ist ist doch heute
kein Problem. Bedenke dass du diese Speicheranforderung nur für deine Vergleiche brauchst und dann den Speicher
wieder freigeben kannst. Experimentiere mal in diesem Sinne, möglicherweise ändert sich deine Meinung durch Erkenntnis.mfg