[Hilfe] Files
-
Guten Abend zusammen!
Aufgabenstellung:
Ich hab 2 vorgegebene .txt Dateien:
Eins heißt vocab.txt(hier steht drinnen):
I Ich
can kann
translate übersetzenUnd das 2. heißt english.txt(hier steht drinnen):
I can translateIch muss aus engl.txt herauslesen und dann mit dem vocab.txt vergleichen welche Wörter gleich sind.
Wenn ich ein übereinstimmendes Wort gefunden haben z.B I dann muss ich das was rechts neben I steht im vocab.txt in dem Fall das Ich in deutsch.txt speichernSo habe ich angefangen, aber ich weis gar nicht wie ich das machen soll.
#include <stdio.h> void copy(char filename[],char filename2[]); void copy(char filename[],char filename2[]) { FILE * file1 = NULL; FILE * file2 = NULL; FILE * file3 = NULL; char temp[40]; char temp2[40]; char hilf[40]; int x = 0; file1 = fopen(filename,"r"); file2 = fopen(filename2,"r"); file3 = fopen("deutsch.txt","w"); if(file1 == NULL) { exit(-1); printf("Fehler beim lesen\n"); } if(file2 == NULL) { exit(-1); printf("Fehler beim lesen\n"); } if(file3 == NULL) { exit(-1); printf("Fehler beim schreiben\n"); } while(!feof(file1)) { fscanf(file1,"%s",temp); while(temp[x] != ' ') { hilf[x] = temp[x]; x++; } } fclose(file1); fclose(file2); fclose(file3); } int main() { char filename[20] = "engl.txt"; char filename2[20] = "vocab.txt"; copy(filename,filename2); return 0; }
Grüße
-
Reicht es, wenn später die Übersetzung von 3-5 Worten funktioniert oder soll das Programm so sein, dass man theoretisch auch ein ganzes Wörterbuch benutzen könnte?
In beiden Fällen würde ich als Strategie vorschlagen, die Wörterbuchdatei einzulesen und in einer Datenstruktur zu speichern, in der man die Wörter schnell nachschlagen kann. Für eine einfache Hausaufgabe mag dies ein einfaches Array von
struct{char * englisch, *deutsch;};
sein, vorzugsweise sortiert für etwas schnelleres Suchen. Für das ganze Wörterbuch sollte man etwas mehr Anspruch haben und beispielsweise eine Baumstruktur erstellen.
-
Nein, es muss nur die 3 Wörter übersetzen die halt in engl.txt drinnenstehn.
-
Dann würde ich dir erst einmal vorschlagen, deine Gedanken und dein Programm zu ordnen. Du scheinst selber noch keinen Plan zu haben, wie du überhaupt vorgehen könntest. Hab keine scheu, dir Zettel und Stift zur Hilfe zu nehmen.
Zu deinem Programm:
- Variablennamen file1, file2, file3, temp, temp2 und hilf. Das grenzt schon an Selbstbestrafung, solche Namen zu benutzen. Da könntest du auch _, __, _I_, _O_ und ähnliches nehmen, das wird genauso übersichtlich.
- Aus dem Rest deines Programms schließe ich, du hast vermutlich:- Wenig Erfahrung mit Einleseaktionen
- Überhaupt keine Ahnung von Zeichenketten
Das musst du natürlich erst einmal abstellen, damit du überhaupt einen Plan formulieren kannst, was zu tun ist.
-
int suche(FILE *f,char *e,char *d) { char s[100],r[100]; rewind(f); while( fgets(s,100,f) ) if( 2==sscanf(s,"%s%s",r,d) && !strcmp(r,e) ) return 1; return 0; } void uebersetze(char *a,char *b,char *c) { FILE *v=fopen(a,"r"),*e,*d; if( v ) { if( e=fopen(b,"r") ) { if( d=fopen(c,"w") ) { char s[100],r[100]; while( 1==fscanf(e,"%99s",s) ) fprintf(d,"%s ",suche(v,s,r)?r:s); fclose(d); } fclose(e); } fclose(v); } } int main() { uebersetze("vocab.txt","engl.txt","deutsch.txt"); return 0; }
-
So, ich habs jetzt alleine geschrieben, aber in deutsch.txt gibt es mir nur das Wort "übersetzen" aus.
Es soll, aber "Ich kann übersetzen" ausgeben.Könnt ihr mir paar Tipps geben bitte?
Grüße
#include <stdio.h> void search_and_translate(char filename[]); void search_and_translate(char filename[]) { FILE*english=NULL; FILE*vocabel=NULL; FILE*deutsch=NULL; char untranslated[100]; char translated[100]; char temp[100]; int n=0; english=fopen(filename,"r"); if(english==NULL) { printf("fehler beim lesen"); } vocabel=fopen("vocab.txt","r"); if(vocabel==NULL) { printf("fehler beim lesen"); } deutsch=fopen("deutsch.txt","w"); if(deutsch==NULL) { printf("fehler beim lesen"); } while(!feof(english)) { fscanf(english,"%s",&temp); while(!feof(vocabel)) { fscanf(vocabel,"%s %s",&untranslated,&translated); } if(temp[n] == untranslated[n]) { fprintf(deutsch,"%s",translated); n++; } } } int main() { char filename[50]="engl.txt"; char temp[50]; search_and_translate(filename, temp); return(0); }
-
Am Ende des ersten Schleifendurchlaufs der äußeren Schleife (ab Zeile 36) steht der Lesezeiger der Übersetzungsdatei am Dateiende - das heißt beim zweiten Durchlauf sind keine Vokabeln mehr zum Einlesen übrig.
Die einfachste Lösung dürfte sein, per rewind() zurückzuspringen auf den Dateianfang.
PS: Und schau dir mal im Debugger an, ob die richtigen Daten gelesen werden.
-
Ok, ich bins jetzt mit dem Debugger durchgegangen.
Und hab auch die Klammer der 2. while vertauscht so das es in deutsch.txt jetzt ich ausgibt.
while(!feof(english)) { fscanf(english,"%s",&temp); while(!feof(vocabel)) { fscanf(vocabel,"%s %s",&untranslated,&translated); if(temp[n] == untranslated[n]) { fprintf(deutsch,"%s",translated); n++; } } }
Nach dem 1. Durchgang wo es das ich in deutsch.txt speichert geht der
"Debugger" nicht mehr ins fprintf von der if rein. Warum nicht?rewind haben wir noch nicht gelernt. Kann man das nicht anders lösen?
-
C-Anfänger005 schrieb:
rewind haben wir noch nicht gelernt. Kann man das nicht anders lösen?
Ja, mit
fseek(vokabel,0,SEEK_SET)
. Alternativ packst du den kompletten Datei-Inhalt in ein Array und suchst anschließend die Übersetzungen aus diesem Array heraus.
-
Du hast überhaupt nichts begriffen.
Du verwendest fscanf ohne zu wissen, wie man es verwendet oder was es tut.
Du verwendest feof falsch und auf undefinierte Weise.
Du machst Stringvergleiche komplett falsch, was darauf schließen lässt, dass du nicht weißt, was ein String ist.
An deinem Code ist nichts besser geworden, du bist nicht lernfähig- oder willig.