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 vorausfopen(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örtercontinue
undbreak
an.
Wenn du die richtig einsetzt, brauchst du auch keinZeilen-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 dessenfgets
vonstdin
(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 daszeilenanzahl++;
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