Zeile aus Datei in string kopieren und mit einem anderen vergleichen



  • Hallo, ich bin dabei mir einen kleinen Vokabeltrainer zu basteln.
    Dabei will ich eine bestimmte Zeile aus einem Textdokument ausgeben (z.B englische Vokabel), anschließend die darüberliegende Zeile (passende deutsche Übersetzung) in einem string speichern und mit der Eingabe des Benutzers vergleichen.
    Leider gibt der Befehl "strcmp" bei mir immer aus, dass es falsch ist und ich kann den Fehler nach gefühlter stundenlanger Suche einfach nicht finden...
    ich hoffe ihr könnt mir weiterhelfen.
    Danke schonmal im voraus

    fopen(vokabeldatei, "rb");
    char d;
    int zeilenanzahl=0;
    char temp[20];
    char deutsch[20];
    int k=0;
    
    while (((d = fgetc(datei)) != EOF)) {
    
            if (d == '\n') {
    		zeilenanzahl++;
    	}
    	if (zeilenanzahl==(i-1)){     // i ist eine vorher generierte Zufallszahl
    
    		temp[k]=d;
    		k++;
    	}
    
    	if (zeilenanzahl==i){
    		putchar(d);
    
    	}
    }
    temp[k]='\0';
    
    for(int j=0; temp[j]!='\0'; j++){
    	deutsch[j]=temp[j+1];	   //Zeilen-Abstands-Zeichen aus string entfernen
    
    }
    
    puts("\n");
    
    // Eingabe und Vergleich der Übersetzung
    
    char eing_deutsch[20];
    
    do{
    	gets(eing_deutsch);    //Eingabe des Benutzers
    
    }while (strcmp(deutsch,eing_deutsch)!=0);
    puts ("Richtig");
    


  • Damit du EOF richtig nutzen kannst, muss d ein int sein.

    Du liest die ganze Datei ein, damit du zwei Zeilen einlesen/ausgeben kannst.
    Schau dir mal die Schlüsselwörter continue und break an.
    Wenn du die richtig einsetzt, brauchst du auch kein Zeilen-Abstands-Zeichen aus string entfernen
    Dabei kopierst du übrigens die '\0' nicht mit.

    Das kannst du mit dem Debugger rausfinden oder einfach indem du mal eine Testausgabe machst:

    printf("<%s|%s|%s>\n", temp, deutsch, eing_deutsch);
    

    Achte dabei auf die Positionen von <, > und |.

    gets ist böse, da es nicht weiß wie groß das Array ist in das du einliest.
    Nimm statt dessen fgets von stdin (da ist allerdings dann das '\n' am Ende noch drin).
    fgets kannst du auch zum Einlesen von der Datei nehmen.



  • -MOB- schrieb:

    fopen(vokabeldatei, "rb");
    

    Hierdurch überlebt ein störendes '\r' bei Windows-Textdateien.

    -MOB- schrieb:

    for(int j=0; temp[j]!='\0'; j++){
    	deutsch[j]=temp[j+1];	   //Zeilen-Abstands-Zeichen aus string entfernen
    

    Das ist auch Müll, wo wird hier temp[0] gespeichert?



  • Wutz schrieb:

    Das ist auch Müll, wo wird hier temp[0] gespeichert?

    Das soll doch weg, da dort das '\n' steht.
    Durch das zeilenanzahl++; am Anfang der Schleife, wird das '\n' von der letzten Zeile am Anfang des Wortes abgelegt. 🙄



  • ok continue und break sind drin.
    die Testausgabe ergibt allerdings für:
    temp: das zu erwartende "/n"vokabel
    und für deutsch und eing_deutsch exakt das selbe, weshalb ich ja das fehlerhafte strcmp nicht verstehe 😕



  • aah... das fehlende '\0' am Ende von deutsch[] war das Problem:)
    Danke für die Hilfe


Anmelden zum Antworten