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.


Anmelden zum Antworten