programm zum unix befehl diff
-
hallo ihr
ich komme hier einfach nicht mehr weiter:
will ein programm schreiben, was den diff - befehl unter unix simuliert, nur eben in c programmiert (natürlich nur die grundfunktion des befehls).
diff gibt die unterschiede von 2 dateien zeilenweise aus.
mein bisheriger code gibt aber irgendwie alles aus, auch übereinstimmende zeilen, nur leuchtet mir der grund dafür nich ein.folgender code:
#include <unistd.h> #include <stdio.h> #include <stdlib.h> #include <fcntl.h> #include <sys/stat.h> #include <string.h> int main(int argc, char **argv) { int quelle, quelle2; char *Buff, *Buff2; char delims[] = "\n\r"; char delims2[] = "\n\r"; char *result = NULL; char *result2 = NULL; int readcount=0,readcount2=0,max; off_t position, size,size2,i=0; if(argc != 3) { printf("Verwendung : %s [datei1] [datei2]\n", *argv); return EXIT_FAILURE; } ; quelle = open(argv[1], O_RDONLY); if (quelle != -1) { printf ("Datei %s erfolgreich geoeffnet\n", argv[1]); } else { perror ("Quelldatei konnte nicht geoeffnet werden"); return EXIT_FAILURE; } quelle2 = open(argv[2], O_RDONLY); if (quelle2 != -1) { printf ("Datei %s erfolgreich geoeffnet\n", argv[2]); } else { perror ("Quelldatei konnte nicht geoeffnet werden"); return EXIT_FAILURE; } if(quelle != -1 && quelle2 != -1) { size = lseek(quelle,0,SEEK_END); printf("Quelle 1 Größe: %d\n",size); Buff = (char *)malloc(size*sizeof(char)); //Speicher allokieren position = lseek(quelle,0,SEEK_SET); size2 = lseek(quelle2,0,SEEK_END); printf("Quelle 2 Größe: %d\n",size2); Buff2 = (char *)malloc(size2*sizeof(char)); //Speicher allokieren position = lseek(quelle2,0,SEEK_SET); readcount=read (quelle, Buff, size); readcount2=read (quelle2, Buff2, size2); result = strtok (Buff, delims); result2 = strtok (Buff2, delims2); while (result && result2){ max=strlen(result); if ((strncmp(result,result2, max)!=0) || (max!=strlen(result2))){ printf("Unterschied Zeile %d:\n%s\n",i,result); printf("%s\n",result2); } i++; result = strtok( NULL, delims ); result2 = strtok( NULL, delims2 ); } } else { perror("Fehler beim Oeffnen von Quelldatei"); return EXIT_FAILURE; } close (quelle); printf ("Vergleich beendet\n"); return EXIT_SUCCESS; }
vielleicht könnt ihr mir einen denkanstoß geben
danke vielmals
-
also, wir sind keine menschlische Debugger. Vielleicht führst du ein Bsp vor und zeigst, was du erwartest und was du tatsächlich bekommst.
will ein programm schreiben, was den diff - befehl unter unix simuliert, nur eben in c programmiert
und wieso castest du dann malloc?
-
also gewünscht ist folgendes:
datei "test1" inhalt:
testdatei1 hier ist der inhalt unterschied ende
datei "test2" inhalt:
testdatei2 hier ist der inhalt unterschiedlich ende
auf einen blick sieht man die unterschiede, und zwar in Zeile 1 und 3 der zweiten Datei.
der Befehl "./mydiff test1 test2" sollte nun folgende Ausgabe bewirken:Unterschied in Zeile1: testdatei1 testdatei2 Unterschied in Zeile3: unterschied unterschiedlich
Vergleich beendet
so in dem stil. allerdings passiert bei mir folgendes:
Unterschied in Zeile 0: testdatei1 testdatei2 Untershied in Zeile 1: hier ist der inhalt unterschiedlich Unterschied in Zeile 2: ende ? Vergleich beendet
-
Inqui schrieb:
allerdings passiert bei mir folgendes:
Unterschied in Zeile 0: testdatei1 testdatei2 Untershied in Zeile 1: hier ist der inhalt unterschiedlich Unterschied in Zeile 2: ende ? Vergleich beendet
offensichtlich kommt nach jedem gefundenen unterschied ein versatz von einer zeile rein. danach müssteste mal suchen.
-
Und hier die Auflösung:
Mit strtok() kann man nicht mehrere Strings parallel zerlegen, da es statisch gespeicherte Informationen verwendet (muss es auch, sonst würden spätere Aufrufe mit NULL ja nicht funktionieren). Deswegen gibt es strtok_r(), aber leider nicht im C-Standard.