Hallo Kalsan,
Hallo Peter
int anfangslisteLeeren=0;
long zaehler=0,zaehlerR=0,zaehlerF=0;
char zeichen,sprache1[100],sprache2[100],eingabe[500];
FILE *flAnf,*flGut,*flF1,*flF2,*flF3;
Das sollte reichen, denke ich, oder?
Grundsätzlich sehe ich einmal zwei Probleme:
- char zeichen
Ist ein bekannter Fehler.
Normalerweise ist char 8 Bit aber EOF ist ein 16-Bit Wert.
Werde ich sofort korrigieren.
Es kommt noch hinzu ob char singned oder unsigned ist.
Was heisst das?
- char sprache1[100],sprache2[100]
Du überprüfst nirgendwo wieviele Zeichen du schon gelesen hast
!
Wenn in deiner Datei mehr als 99 Zeichen vor oder nach dem TAB
stehen, erzeugst du einen Buffer overrun. Wie sich dein
Programm dann verhält, kann die keiner sagen.
Das Problem ist mir bekannt. Allerdings besteht bei diesem Programm keine Gefahr, da es sich nur um kurze Vokabularwörter handelt. Sie überschreiten die Maximalgrösse niemals.
Was jetzt noch fehlt ist wie du die Datei öffnest. Und poste
doch mal was in deiner Datei wirklich drin steht. Da es reiner
Text ist, kannst du dir diese z.B. mit Notepad ansehen.
Ich habe kein Notepad, aber öffne die Dateien stets mit dem Editor. Nun überprüfe ich die Datei bei jeder Etappe:
Vor dem Programmstart: Datei existiert nicht.
Gleich nach dem Start: Die Datei wurde erstellt und ist leer.
Nach dem Schreiben: Die Datei ist noch immer leer!
Nach dem Beenden des Programms: Nun enthält die Datei alle Daten, die sie eigentlich schon vorhin enthalten müsste. Merkwürdig, irgendwie werden die Daten erst nach dem Programmende hineingeschrieben, deshalb meldet er wohl auch EOF.
Anderes Szenario: Diesmal enthält die Datei schon vor dem Programmstart Text.
Nach dem Programmstart: Die Datei enthält noch immer die alten Einträge(das ist auch gut so).
Nach dem Schreiben: Die Datei enthält noch immer nur die alten Einträge. Beim Lesen wird trotzdem EOF zurückgemeldet.
Nach dem Beenden: Die Datei enthält alle Einträge, zuerst die alten, dann die neuen.
MfG Peter(TOO)
Ziemlich verzwickt, was?
Damit ihr es 1:1 ausprobieren könnt, hier einmal das gesamte Programm (alles in main.c):
#include
#include
#include
int anfangslisteLeeren=0;
long zaehler=0,zaehlerR=0,zaehlerF=0,zeichen;
char sprache1[100],sprache2[100],eingabe[500];
FILE \*flAnf,\*flGut,\*flF1,\*flF2,\*flF3;
int fileTest();
void dateienSchliessen();
int wortEinlesen();
int abfragenAnf();
int abfragenF1();
int abfragenF2();
int abfragenF3();
int main()
{
if (fileTest())
{
printf("ok.\n\n");
abfragenAnf();
fclose(flF1);
flF1=fopen("lF1.txt","r");
abfragenF1();
dateienSchliessen();
}
return 0;
}
/\*
lAnf: Anfangsliste: Für neue Wörter, sie wird danach geleert.
lGut: Wörter, die richtig beantwortet wurden.
lF1: Wörter, die einmal falsch beantwortet wurden.
lF2: Wörter, die zweimal falsch beantwortet wurden.
lF3: Wörter, die dreimal oder häufiger falsch beantwortet wurden.
\*/
int fileTest()
{
printf("Ueberpruefen der Dateien...");
flAnf=fopen("lAnf.txt","r");
if (flAnf==0)
{
sag("\n!!! Die Anfangsdatei existiert nicht. Sie wurde erstellt.\nBitte Programm neu starten.\n\n");
flAnf=fopen("lAnf.txt","w+");
fclose(flAnf);
return 0;
}else{
flGut=fopen("lGut.txt","a");
flF1=fopen("lF1.txt","a");
flF2=fopen("lF2.txt","a");
flF3=fopen("lF3.txt","a");
return 1;
}
}
void dateienSchliessen()
{
fclose(flAnf);
fclose(flGut);
fclose(flF1);
fclose(flF2);
fclose(flF3);
}
int wortEinlesen(FILE\* quelldatei)
{
sprache1[0]='\0';
sprache2[0]='\0';
zaehler=0;
while ((zeichen != EOF)&&(zeichen!='\t'))
{
zeichen = fgetc(quelldatei);
if(zeichen!='\t')
{
sprache1[zaehler]=zeichen;
zaehler++;
}
}
sprache1[zaehler]='\0';
if (zeichen==EOF){return 2;}else{
zaehler=0;
while ((zeichen != EOF)&&(zeichen!='\n'))
{
zeichen = fgetc(quelldatei);
if(zeichen!='\n')
{
sprache2[zaehler]=zeichen;
zaehler++;
}
}
sprache2[zaehler]='\0';
//printf("\n1: %s\n2: %s\n",sprache1,sprache2);
return 1;
}
}
int abfragenAnf()
{
printf("\nAnfangsliste\n=========================================================\n");
zaehlerF=0;
zaehlerR=0;
while(wortEinlesen(flAnf)!=2)
{
afrag(sprache1,eingabe);
if (strcmp(eingabe,sprache2)==0)
{
printf(" %c Richtig!\n",2);
zaehlerR++;
fprintf(flGut,"%s\t%s\n",sprache1,sprache2);
}
else{
printf(" ! Falsch! Korrekte Antwort: %s\n",sprache2);
zaehlerF++;
fprintf(flF1,"%s\t%s\n",sprache1,sprache2);
}
}
printf("\n---------------------------------------------------------\nEnde der Anfangsliste.");
printf(" %ld richtig und %ld falsch.\n\n",zaehlerR,zaehlerF);
if(anfangslisteLeeren)
{
fclose(flAnf);
flAnf=fopen("lAnf.txt","w+");
}
return 1;
}
int abfragenF1()
{
printf("\nFehlerliste Niveau 1\n=========================================================\n");
zaehlerF=0;
zaehlerR=0;
while(wortEinlesen(flF1)!=2)
{
afrag(sprache1,eingabe);
if (strcmp(eingabe,sprache2)==0)
{
printf(" %c Richtig!\n",2);
zaehlerR++;
fprintf(flGut,"%s\t%s\n",sprache1,sprache2);
}
else{
printf(" ! Falsch! Korrekte Antwort: %s\n",sprache2);
zaehlerF++;
fprintf(flF2,"%s\t%s\n",sprache1,sprache2);
}
}
printf("\n---------------------------------------------------------\nEnde der Fehlerliste Niveau 1.");
printf(" %ld richtig und %ld falsch.\n\n",zaehlerR,zaehlerF);
return 1;
}
Die Bibliothek „Bisan“ wurde von mir entwickelt. Nachfolgend ihr Inhalt:
#include
#include
#include
void sag(char eingang[500])
{
printf("%s",eingang);
}
int lies(char \*ausgang)
{
char \*positionEntree = NULL;
int c = 0;
if (fgets(ausgang, 500, stdin) != NULL)
{
positionEntree = strchr(ausgang, '\n');
if (positionEntree != NULL)
{
\*positionEntree = '\0';
return 1;
}
else
{
while (c != '\n' && c != EOF)
{
c = getchar();
}
return 0;
}
}
else
{
while (c != '\n' && c != EOF)
{
c = getchar();
}
return 0;
}
}
void alies(char \*ausgang)
{
while(lies(ausgang)==0)
{
printf("\n!!! Die Eingabe ist zu lang. Maximal 500 Zeichen sind erlaubt.\nBitte Eingabe wiederholen.\n");
}
}
int frag(char frage[500], char \*ausgang)
{
printf("\n%s\n",frage);
if (lies(ausgang))
{
return 1;
}else{
return 0;
}
}
void afrag(char frage[500], char \*ausgang)
{
printf("\n%s\n",frage);
alies(ausgang);
}
long zfrag(char frage[500])
{
long ausgang;
int c=0;
printf("\n%s\n",frage);
scanf("%ld",&ausgang);
while (c != '\n' && c != EOF) //^= vider buffer
{
c = getchar();
}
return ausgang;
}
double dfrag(char frage[500])
{
double ausgang;
printf("\n%s\n",frage);
scanf("%lf",&ausgang);
return ausgang;
}
Danke für eure Hilfe!
Kalsan