Datein vergleichen



  • Also so wie ich das verstanden hab, willst du nur Zeilen vergleichen nicht einzelne Zeichen.
    Also musst du Zeilenweise einlesen und das am besten in einem Array speichern, dann vergleichst du beide Arrays mit strcmp(); , das ist schon alles, dann halt nur noch ne variable die Hochzählt wie viele Zeilen identisch waren.

    mfg hohesC

    @c.rackwitz: so verloren sieht das doch nicht aus, wenn er eben Anfänger ist!

    bitte nimm dir ein tutorial

    Wenn man das zu jedem sagen würde gäbe es das Forum nicht mehr! 😉



  • Dieses Programm machts so wie ich oben beschrieben hab!
    Hab nur zum Testen ohne Kommandozeilenparameter gemacht, musst halt noch ab ändern.

    #include <stdio.h> 
    #include <string.h>
    
    int datcmp(char *file_name1,char *file_name2); 
    
    int main(int argc, char **argv) 
    {
    	printf("%i",datcmp("m1.txt","m2.txt")); //Dateinamen angeben, oder Kommandozeilenparameter
    
    	return (0) ;
    }
    
    int datcmp(char *file_name1,char *file_name2)
    {
    	FILE *fp1,*fp2;        //Filepointer
    	char arr1[1000]={0},arr2[1000]={0};  //Arrays zum zwischenspeichern der Zeilen
    	int i=0; //Variable zum hochzählen der erfolgreich verglichenen Zeilen
    
    	fp1=fopen(file_name1,"r");    //1.Datei zum lesen öffnen
    	fp2=fopen(file_name2,"r");    //2.Datei zum lesen öffnen
    
    	while(fgets(arr1,1000,fp1)) //Zeilenweises einlesen
    	{
    		while(fgets(arr2,1000,fp2)) //Zeilenweises einlesen
    		{
    			break;
    		}
    		if(strcmp(arr1,arr2)==0) //Vergleich der Zeilen
    		{
    			i++;
    		}
    	}
    
    	fclose(fp1);    //Schließen der Datei
    	fclose(fp2);    //Schließen der Datei
    
    	return (i);    //rückgabe der Anzahl gleicher Zeilen
    }
    

    mfg hohesC

    [edit]Beschreibung/Kommentare zugefügt 😉 [/edit]



  • VIelen Dank für die tolle antwort kapiers langsam.
    Noch eine Frage zu meiner "Lösung", die war einfach völlig falsch oder gab es zumindest gute ansätze



  • Um ehrlich zu sein habe ich dein Konzept gar nicht verstanden, war bisschen unverständlich aber das macht nix 😉
    Am Anfang ist es eh immer schwer, man muss bloß einmal dahinter gestiegen sein und dann fällt es einem leicht.

    mfg hohesC



  • Hallo
    hab dein Programm jetzt vertanden und auch geschafft es einzubinden, nur hab ich jetzt das Problem das es nur zeilenweise vergleicht, -> also nur Zeile 1 von Datei 1 mit Zeile 1 von Datei 2 und dann Zeile 2 von Datei 1 und Zeile 2 von Datei 2
    Was ich aber machen muss ist zu schauen ob z.B. Zeile1 von Datei 1 überhaupt in Datei 2 vorkommt und wenn ja den Counter erhöhen.
    Kann man mir tipps geben welche Befehle ichdafür brauch.
    Mir ist klar das ich wahrscheinlich eine for oder while schleife brauch aber ich weiß nicht weiter



  • hab dein Programm jetzt vertanden und auch geschafft es einzubinden, nur hab ich jetzt das Problem das es nur zeilenweise vergleicht, -> also nur Zeile 1 von Datei 1 mit Zeile 1 von Datei 2 und dann Zeile 2 von Datei 1 und Zeile 2 von Datei 2

    Keine Überraschung, weil hohesC sich in seinem Programm vertan hat.
    Der Vergleich und das erhöhen des Zählers muss mit in die innere while-Schleife,
    nicht dahinter.



  • Also hab es mir so gedacht ich muss mall schauen wieviele Lines eine Datei hat und die Anzahl als var speichern

    for ( i=0; i<anz_lines;i++;)
    

    und jetzt mein Problem wie finde ich raus wieviele lines die datei hat und wie spreche ich dann eine einzelne line an



  • Keine Überraschung, weil hohesC sich in seinem Programm vertan hat.
    Der Vergleich und das erhöhen des Zählers muss mit in die innere while-Schleife,
    nicht dahinter.

    Stimmt hab gedacht er wollte das so, sorry!
    Musst ja blos umstellen 🙂

    mfg hohesC



  • also hab es so umgeändert wie ihr gesagt habt aber es geht trotzdem nicht
    bei mir schaut es jetzt so aus

    int datcmp(char *file_name1,char *file_name2)
    {
        FILE *fp1,*fp2;        //Filepointer
        char arr1[1000]={0},arr2[1000]={0};  //Arrays zum zwischenspeichern der Zeilen
        int i=0; //Variable zum hochzählen der erfolgreich vergleichten Zeilen
    
        fp1=fopen(file_name1,"r");    //1.Datei zum lesen öffnen
        fp2=fopen(file_name2,"r");    //2.Datei zum lesen öffnen
    
        while(fgets(arr1,1000,fp1)) //Zeilenweises einlesen
        {	 
            while(fgets(arr2,1000,fp2)) //Zeilenweises einlesen
            { 
    		 if(strcmp(arr1,arr2)==0) //Vergleich der Zeilen
            {
                i++;
            } 
    
    			break;
    
            }
    
        }
    
        fclose(fp1);    //Schließen der Datei
        fclose(fp2);    //Schließen der Datei
    
        return (i);    //rückgabe der Anzahl gleicher Zeilen
    }
    

    bei den Dateien die so auschauen

    9, 21, 6
    10, 20, 31
    98, 12, 45
    

    als erstes File und zweites File das so auschaut

    11, 32, 9
    98, 12, 45
    11, 21, 31
    100, 1, 0
    

    also müsste er mir ja ein zurückgeben wegen 98, 12, 45 aber ich kriege null zurück



  • Sorry war Gestern nicht mehr im Forum:

    int datcmp(char *file_name1,char *file_name2) 
    { 
        FILE *fp1,*fp2;        //Filepointer 
        char arr1[1000]={0},arr2[1000]={0};  //Arrays zum zwischenspeichern der Zeilen 
        int i=0; //Variable zum hochzählen der erfolgreich vergleichten Zeilen 
    
        fp1=fopen(file_name1,"r");    //1.Datei zum lesen öffnen 
        fp2=fopen(file_name2,"r");	  //2.Datei zum lesen öffnen
    
        while(fgets(arr1,1000,fp1)) //Zeilenweises einlesen 
        {      
    
    		while(fgets(arr2,1000,fp2))//Zeilenweises einlesen 
            {
    			if(strcmp(arr2,arr1)==0) //Vergleich der Zeilen 
    			{ 
    					i++;
    			} 
    
    		}
    
            fseek( fp2, 0, SEEK_SET ); //wieder auf den Anfang setzen
        } 
    
        fclose(fp1);    //Schließen der Dateiên 
        fclose(fp2);
        return (i);    //rückgabe der Anzahl gleicher Zeilen 
    }
    

    damit gehts wie dus dir vorstellst!

    mfg hohesC



  • Hohes C, vielen vielen Dank du bist echt eine rießen Hilfe
    Danke sehr


Anmelden zum Antworten