Problem beim vergleichen von 2 Dateien
-
Hi @ all
ich versuche hier krampfhaft zu untersuchen ob eine datei ein teil von einer anderen Datei ist. (ob die eine datei komplett als zeilenfolge in der anderen enthalten ist)mit vielen vielen if-anweisungen und strcmp() hab ich es auch fast(!!!) geschafft.
allerdings stört mich, dass das programm diese zeilenfolge findet, selbst wenn eine nicht zutreffende zeile dazwischen ist.wollte daher einfach die eine datei mit rewind() zurück auf den startpunkt setzen sobald eine nicht passt. aber das klappt so nicht, findet jemand zufällig den fehler?
else if(strncmp(orig_line,cmp,14)!=0 && s == 1) { s = 0; //rewind(search_file); // klappt nicht fseek(search_file, 0L, SEEK_CUR); // das auch nicht }
-
Was heißt "klappt nicht"? Was tut denn rewind bei dir?
-
gar nichts.
zumindestens setzt er den zeiger der einen datei nicht auf den anfang wie er eigentlich sollte.
kann natürlich auch sein, dass beim restlichen code ein fehler drin ist...if(strncmp(orig_line,cmp,82)==0) { if(fgets(cmp,MAX_LINE_LEN,search_file)==NULL) { rewind(search_file); fgets(cmp,MAX_LINE_LEN,search_file); num = num + 1; printf("# %i.Match in Line %d - %d \n" ,num,sline,nline); } } else if(strncmp(orig_line,lastline,82)!=0) { rewind(search_file); }
-
manu1984 schrieb:
Hi @ all
ich versuche hier krampfhaft zu untersuchen ob eine datei ein teil von einer anderen Datei ist. (ob die eine datei komplett als zeilenfolge in der anderen enthalten ist)Hi!
Zeilenweise wuerde ich das nicht machen.
#include <stdio.h> #include <stdlib.h> #include <string.h> // memcmp() FILE* stream1, *stream2; int main() { size_t sizeA, sizeB, i; unsigned char* bufA, *bufB; stream1 = fopen ("file1.txt", "rb"); stream2 = fopen ("file2.txt", "rb"); fseek (stream1, 0L, SEEK_END); fseek (stream2, 0L, SEEK_END); sizeA = ftell(stream1); sizeB = ftell(stream2); bufA = malloc (sizeA); bufB = malloc (sizeB); fseek (stream1, 0L, SEEK_SET); fseek (stream2, 0L, SEEK_SET); fread (bufA, 1, sizeA, stream1); fread (bufB, 1, sizeB, stream2); _fcloseall(); for (i = 0; i <= (sizeB-sizeA); i++) if (!memcmp(bufA, bufB+i, sizeA)) { printf ("file1 ist enthalten in file2, ab Position %d\n", i); break; } free (bufA); free (bufB); return 0; }
mfg
-
hm ... das geht eher in richtung c++, oder?
bei memcmp kann ich aber nicht einstellen, dass er z.b. nur die ersten 10 zeichen vergleichen soll, oder?
(optionen sind eben, dass man nur nach den ersten 10 zeichen sucht, nach den ersten 20 oder nach allen.)
das würde mit memcmp nicht gehen, oder?und was mach ich denn mit der fehlermeldung "cannot assign void* to char* ?
-
manu1984 schrieb:
hm ... das geht eher in richtung c++, oder?
bei memcmp kann ich aber nicht einstellen, dass er z.b. nur die ersten 10 zeichen vergleichen soll, oder?
(optionen sind eben, dass man nur nach den ersten 10 zeichen sucht, nach den ersten 20 oder nach allen.)
das würde mit memcmp nicht gehen, oder?Klar kannst du bei memcmp() angeben, wieviele Zeichen du vergleichen willst - dazu trägst du die entsprechende Anzahl als letzten Parameter ein (alternativ kannst du auch nur die ersten x Bytes aus Datei A einlesen).
manu1984 schrieb:
und was mach ich denn mit der fehlermeldung "cannot assign void* to char* ?
Einen C-Compiler verwenden (in C ist die implizite Umwandlung von void* nach irgendwas* legal, in C++ brauchst du dazu einen expliziten Cast).
-
ich hab so einen dämlichen unix compiler. das sollte sich mit dem allerdings compilieren lassen.(denke allerdings, das ist ein c++-compiler)
und was mir eben aufgefallen ist:
der sucht das ja solange bis er es einmal gefunden hat.
und was macht er wenn es 3x drin vorkommt?
ich bräuchte alle treffer!wenn man sich nochmal meinen code anschaut, ich bin der meinung, da fehlt nicht mehr viel. hab ich einen dreher im code?
er macht es ja schon... aber eben nicht 100% richtig *g*
-
manu1984 schrieb:
ich hab so einen dämlichen unix compiler. das sollte sich mit dem allerdings compilieren lassen.(denke allerdings, das ist ein c++-compiler)
Wenn du in der Doku deines Compilers keine Möglichkeit findest, ihn in "C-Modus" zu versetzen (btw, wie heißt denn der Compiler - vielleicht kennen die "Experten" ja die richtige Einstellung), bleibt dir immer noch die (unter C-Programmierern extrem unbeliebte) Notfall-Lösung, die Rückgabewerte von malloc() explizit nach (char*) zu casten.
(oder noch besser - du definierst die beiden Puffer-Variablen alsvoid *bufA,*bufB;
und was mir eben aufgefallen ist:
der sucht das ja solange bis er es einmal gefunden hat.
und was macht er wenn es 3x drin vorkommt?
ich bräuchte alle treffer!Ja, die Suchschleifen wird ja auch beim ersten Treffer per break verlassen - wenn du alle Treffer brauchst, mußt du nach dem Treffer weitersuchen:
int anzahl=0; for (i = 0; i <= (sizeB-sizeA); i++) if (!memcmp(bufA, bufB+i, sizeA)) { ++anzahl; printf ("%d. Treffer gefunden ab Position %d\n",anzahl, i); } printf("Insgesamt %d Treffer gefunden\n",anzahl);
-
bufB = (char*)malloc (sizeB);
so habe ich den Puffer jetzt manuell auf char* gesetzt...
denke, das sollte so richtig sein.
kommen jedenfalls keine fehler mehr, aber er findet auch nichts wenn ich das programm starte
-
Was heißt "findet nichts"? Vielleicht kommt Datei A ja überhaupt nicht in Datei B vor.
-
genau. wie wenn die datei nicht drin vorkommen würde.
allerdings zu testzwecken hab ich 3 zeilen aus der original datei rauskopiert. er müsste sie also finden.findet ihr nicht zufällig in meinem code den fehler? der findet ja doch schon was, also kann er ja gar nicht so falsch sein *g*!!!
-
manu1984 schrieb:
der findet ja doch schon was, also kann er ja gar nicht so falsch sein *g*!!!
Was denn nun? Findet er was oder findet er nichts? Und wie sieht dein jetziger Code aus?
-
also der mit dem memcmp findet nichts.
ich hab davor schonmal was geschrieben, und der findet eben auch was, wenn die zeilen nicht direkt aufeinander folgend vorkommen.if(strcmp(argv[3],"CMD")==0) //Search: CMD+Bank { size_t sizeA, sizeB, i; char *bufA, *bufB; fseek (orig_file, 0L, SEEK_END); fseek (search_file, 0L, SEEK_END); sizeA = ftell(search_file); sizeB = ftell(orig_file); bufA = (char*)malloc (sizeA); bufB = (char*)malloc (sizeB); fseek (search_file, 0L, SEEK_SET); fseek (orig_file, 0L, SEEK_SET); fread (bufA, 1, sizeA, orig_file); fread (bufB, 1, sizeB, search_file); for (i = 0; i <= (sizeB-sizeA); i++) { if (!memcmp(bufA, bufB+i, sizeA)) { ++num; printf ("%d. Treffer gefunden ab Position %d\n",num, i); } } printf("Insgesamt %d Treffer gefunden\n",num); free (bufA); free (bufB); }
und mein alter:
switch(mode) { case 1: if(strncmp(orig_line,search_line,49)==0) { if(fgets(search_line,MAX_LINE_LEN,search_file)==NULL) { rewind(search_file); fgets(search_line,MAX_LINE_LEN,search_file); num = num + 1; printf("# %i.Match in Line %d \n",nline); if(argc == 5) { fprintf(log_file,"Sequence found in Line %d \n",nline); } } }