2 Files vergleichen



  • Guten Abend,

    Ich bin langsam am verzweifeln.
    Wir sollen 2 Textdateien einlesen und diese zeilenweise miteinander vergleichen, wenn die Character nicht übereinstimmen soll ein Counter erhöht werden.
    Dazu kommt noch, dass nur bis zum Ende der kürzesten Zeile verglichen werden soll und nur bis zur minimalen Anzahl an Zeilen.

    Bsp:

    File 1
    abc
    Haustor
    def

    File 2

    abc
    Haus
    de
    ghi

    Hier sollte die Ausgabe "Zeile 3 Fehler 1" sein. Die 2. Zeile ist ok da ja nur bis zum Ende der kürzesten Zeile verglichen wird, sprich "tor" wird ignoriert. Die letzte Zeile von File 2 wird ebenfalls ignoriert, da File 1 nur 3 Zeilen hat.

    int main(int argc, char *argv[])
    {   
        FILE *text1, *text2;
        char line1[50], line2[50];
        int i, counter, pos, lineSize1, lineSize2;
    	lineSize1 = 0;
    	lineSize2 = 0;
        counter = 0;
        pos = 0;
    
        text1 = fopen("file1.txt" , "r");
        text2 = fopen("file2.txt" , "r");
    
        if(text1 == NULL || text2 == NULL)
        {
            perror ("Error opening file");
        }
        else
        {
            while((fgets(line1, 50, text1) != NULL) && (fgets(line2, 50, text2) != NULL))
    		{
    			pos++;
    
    			lineSize1 = strlen(line1);
    			lineSize2 = strlen(line2);
    
    			if(lineSize1 >= lineSize2)
    			{
    				for(i = 0; i < lineSize2; i++)
    				{
    					if(line1[i] != line2[i])
    					{
    						counter++;
    					}
    				}
    			}	
    			else
    			{
    				for(i = 0; i < lineSize1; i++)
    				{
    					if(line1[i] != line2[i])
    					{
    						counter++;
    					}
    				}
    			}
    
    			if(counter != 0)
    			{
    				printf("Zeile: %i Zeichen: %i\n", pos, counter);
    				counter = 0;
    		}
        }
    
        fclose(text1);
        fclose(text2);
    }
    
      system("PAUSE");	
      return 0;
    }
    

    Das ist mein momentaner Lösungsansatz meine beiden Files sehen wie folgt aus:

    File 1
    11
    111
    111

    File 2
    111
    111
    11111

    Die Ausgabe sollte ja eig "Zeile 1 Fehler 1" und "Zeile 3 Fehler 2" sein. aber er gibt mir nur "Zeile 1 Fehler 1" aus. 😕 Ich hoffe ihr könnt mir helfen.

    mfg



  • Gast0404 schrieb:

    Hier sollte die Ausgabe "Zeile 3 Fehler 1" sein. Die 2. Zeile ist ok da ja nur bis zum Ende der kürzesten Zeile verglichen wird, sprich "tor" wird ignoriert.

    Und wo ist der Fehler in Zeile 3? Bis zum Ende der kürzeren Zeile (de) sind die doch gleich.

    Gast0404 schrieb:

    Die Ausgabe sollte ja eig "Zeile 1 Fehler 1" und "Zeile 3 Fehler 2" sein. aber er gibt mir nur "Zeile 1 Fehler 1" aus.

    Ich sehe da gar keinen Fehler. Kannst du nochmal genau erklären, was ein Fehler ist und was nicht?



  • Entschuldige, die Zeilen sollten "df" und "de" sein.

    Der Inhalt der beiden Files ist nicht gerade gut gewählt.

    File1
    abcdefg
    Garten
    abcdefg

    File2
    abcdefg
    Gartenzaun
    ahciejg
    abcdefg

    Bei diesem Beispiel sollte alles stimmen bis auf Zeile 3, in dieser Zeile sind 3 Fehler. Das Programm erkennt das auch nur gibt er in Zeile 2 auch einen Fehler aus, wo aber keiner sein sollte da Garten = Garten ist.

    Ich hoffe man erkennt die Funktion anhand dieser Inhalte besser.

    Zeile 1: abcdefg = abcdefg
    Zeile 2: Garten = Garten (zaun wird ja ignoriert)
    Zeile 3: abcdefg != ahciejg (3 Fehler)
    Zeile 4: wird ignoriert.

    Wie gesagt Zeile 3 wird erkannt nur gibt er mir in Zeile 2 auch einen Fehler aus. Ich weiß leider nicht warum.



  • fgets liest einen ggf. vorhandenen Zeilenumbruch mit ein.



  • Heisst dass das in Zeile 3 das "z" mit einem "\n" verglichen wird?
    Das heisst ich müsste vorher überprüfen ob der Charakter ein Zeilenumbruch ist?

    mfg



  • Gast0404 schrieb:

    Heisst dass das in Zeile 3 das "z" mit einem "\n" verglichen wird?

    Genau so ist es. Mit einem Debugger hättest du das übrigens sehr einfach selbst herausgefunden 😉

    Gast0404 schrieb:

    Das heisst ich müsste vorher überprüfen ob der Charakter ein Zeilenumbruch ist?

    Du könntest auch vor dem Vergleich prüfen, ob das letzte Zeichen ein Zeilenumbruch ist, und es ggf. abschneiden.



  • Vielen Dank für deine Geduld und deine Hilfe!

    Ich werde das Ganze gleich Umsetzen.

    mfg


Anmelden zum Antworten