Lesen und Schreiben in Dateien

Liebe wwws

Ich schreibe gerade ein Programm in C. Dabei wird in eine Datei geschreiben. Nun soll aus der Datei im gleichen Durchgang wieder gelesen werden.
Ich habe es so gemacht:

FILE* datei;

datei=fopen(„Dateiname.txt“,„a“);
inDieDateiSchreiben();
fclose(datei);
datei=fopen(„Dateiname.txt“,„r“);
ausDerDateiLesen();
dateiSchliessen();

Beim Lesen erhalte ich jedes Mal nur ein plumpes EOF als Antwort! Dabei will ich, das die Kiste mir genau das ausspuckt, das sie gleich zuvor geschrieben hat!

Was kann ich tun???

Danke
Kalsan

Hallo!

Beim Lesen erhalte ich jedes Mal nur ein plumpes EOF als

Welche Funktion liefert EOF?

Antwort! Dabei will ich, das die Kiste mir genau das
ausspuckt, das sie gleich zuvor geschrieben hat!

Der Inhalt von „Dateiname.txt“ ist ok, vermute ich?

Was kann ich tun???

Den Inhalt von ausDerDateiLesen(); posten. Da kann nur der Fehler sein.

Jan

Hallo!

Hallo JayVee
Danke für deine Antwort.

Beim Lesen erhalte ich jedes Mal nur ein plumpes EOF als

Welche Funktion liefert EOF?

fgets();

Antwort! Dabei will ich, das die Kiste mir genau das
ausspuckt, das sie gleich zuvor geschrieben hat!

Der Inhalt von „Dateiname.txt“ ist ok, vermute ich?

Ja, aber merkwürdigerweise erst nach der Beendigung des Programms. Vorher erscheint nichts, die Datei ist auf dem alten Stand.

Was kann ich tun???

Den Inhalt von ausDerDateiLesen(); posten. Da kann nur der
Fehler sein.

Posten?! Könntest du dich bitte etwas genauer ausdrücken? Ich bin noch kein Hirsch im C :wink:
(noch nicht mal einen Monat Erfahrung)

Jan

Danke
Kalsan

Hallo Kalsan,

Was kann ich tun???

Den Inhalt von ausDerDateiLesen(); posten. Da kann nur der
Fehler sein.

Posten?! Könntest du dich bitte etwas genauer ausdrücken? Ich

Er meint das so: du kannst deinen Code hier rein kopieren, und ich rate es dir auch, so kann man dir viel eher helfen.
Ein Beispiel:

int a, b;
if (a 

Vergiss bitte nicht auf die pre-Marken, so wie hier, das ist besser leserlich.

lg
Martin B

Ach so!
Also, das wird ein wenig kompliziert, da ich vorhin eine vereinfachte Darstellung „gepostet“ habe.
So sieht die Funktion in Wirklichkeit aus:

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;
 }
}

Die Funktion liest aus einer Datei zwei Wörter, die durch einen Tabulator getrennt sind und hinten einen Abschnitt haben. (Beispiel: können\tpouvoir\n) Es handelt sich um einen Teil eines Vokabularabfrageprogramms.

Die Variablen (vom ganzen Programm):

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?

Danke für eure Hilfe

Kalsan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Kalsan,

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:

  1. char zeichen
    Ist ein bekannter Fehler.
    Normalerweise ist char 8 Bit aber EOF ist ein 16-Bit Wert.
    Es kommt noch hinzu ob char singned oder unsigned ist.

  2. 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.

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.

MfG Peter(TOO)

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:

  1. 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?

  1. 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

Hallo Kalsan,

  1. 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?

Wegen dem signextend sind die Resultate unterschiedlich.
EOF ist meistens 0xFFFF
Wird es auf 8-Bit chsr gekürzt ist der Wert 0xFF.
Wird nun unsigned char von 8 Bit auf 16 Bit erweitert ist das Resultat 0x00FF. Bei signed char wird es zu 0xFFFF.
Der Vergleich erfolg aber mit 0xFFFF, ergibt also unterschiedliche Resultate.
Das ganze gilt entsprechend auch für 32-Bit int. Deshalb wird EOF normalerweise als -1 definiert, der Rest macht dann der Compiler entsprechend den Voreinstellungen.

Bei C ist die Bitbreite abhängig von der CPU und dem Compiler. Zudem kann man oft noch einiges über Parameter einstellen.

Garnatiert ist nur dass:
char

1 Like

Hallo Kalsan,

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.

Siehste, deshalb ist es immer gut, alle Informationen und den gesamten beteiligten Programmcode gleich mit der ersten Frage zu liefern. Sonst passt die Diskussion besser ins Rätselbrett („Ein Mann liegt tot in der Wüste und hat ein Streichholz in der Hand. Was ist passiert?“)

(1) Der Dateiinhalt wird beim Schreiben mit printf() gepuffert. D.h. die Daten gelangen nicht sofort in die Datei sondern bleiben im Speicher, bis der Puffer voll ist oder die Datei geschlossen wird. Abhilfe schafft z.B. ein Aufruf von fflush().

(2) Es gibt pro Datei eine aktuelle Position, an der gelesen und geschrieben wird. Die verändert sich nicht von alleine. Wenn Du Text ans Ende der Datei schreibst, ist die Schreib-/Leseposition anschließend das Dateiende. Ein Leseaufruf gibt dann EOF zurück. Abhilfe: z.B. Funktion fseek() aufrufen.

(3) Die Punkte (1) und (2) können sich gegenseitig beeinflussen.

Also:

  • nach Schreiboperationen fflush() aufrufen
  • wenn der erste Programmteil fertig ist, Datei entweder schließen (dadurch wird auch automatisch fflush() aufgerufen) und erneut öffnen, oder ein fseek() zum Dateianfang machen.

Dann sollte schon mehr passieren

Gruß,
Ralf

Hallo Peter

Programm keine Gefahr, da es sich nur um kurze Vokabularwörter
handelt. Sie überschreiten die Maximalgrösse niemals.

Das dachten sich die Programmierer von MS auch und öffneten
dadurch die Tür für Sasser !!!

Was ist denn „Sasser“, bitte?

Ich habe dieses (Quelle)

aliceblue #F0F8FF
antiquewhite #FAEBD7
aquamarine #7FFFD4

so eingelesen (schematisch):

char name[64];
char value[16];

FILE \*fin = fopen("colors.txt", "rt");
while (fscanf(fin, "%s %s", name, value) != EOF)
{
 /\* damit was machen \*/
}
fclose(fin);

Hier hat der Bio-Scan der Quelle aber auch ergeben, dass ich mit der Speicher-Laenge hinkomme.

mfG
Martin B

Hallo Martin,

Das dachten sich die Programmierer von MS auch und öffneten
dadurch die Tür für Sasser !!!

Was ist denn „Sasser“, bitte?

http://de.wikipedia.org/wiki/Sasser

MfG Peter(TOO)

Hallo,

Hier hat der Bio-Scan der Quelle aber auch ergeben, dass ich
mit der Speicher-Laenge hinkomme.

Ok. Und wenn jetzt jemand eine Datei bastelt, in der ein Farbname mit „abcacbasdlkjhalksjdhflkajsdhjfhwuiluhasdlkjfhlakjsdhflkjahsdlkjfhalsdjkhklajsdhkljhasdlkjhaslkdjhlaksdjhfljkhlakjsdhlfkjhlkjsdh“
angegeben ist? Was passiert dann?

Merke: Alle Werte, die Programme einlesen, müssen stets auf korrekte Länge und korrekten Inhalt überprüft werden! D.h. merkwürdige Steuerzeichen, nicht zulässige Sonderzeichen, etc. sollten herausgefiltert werden!

http://de.wikipedia.org/wiki/Puffer%C3%BCberlauf

Gruß

Fritze

Hallo Ralf

Danke für deine Antwort.

Ich hab’s nun so gemacht: Datei öffnen, schreiben, schliessen, fflush, öffnen, lesen, schliessen.
Gleiche Wirkung.

Siehste, deshalb ist es immer gut, alle Informationen und den
gesamten beteiligten Programmcode gleich mit der ersten Frage
zu liefern. Sonst passt die Diskussion besser ins Rätselbrett
(„Ein Mann liegt tot in der Wüste und hat ein Streichholz in
der Hand. Was ist passiert?“)

Das habe ich nun gemerkt. Ab jetzt werd ichs immer so machen. Vorhin hatte ich Angst, dass ihr das komplexe Programm ohne Notizen nicht verstehen würdet.

(1) Der Dateiinhalt wird beim Schreiben mit printf()
gepuffert. D.h. die Daten gelangen nicht sofort in die Datei
sondern bleiben im Speicher, bis der Puffer voll ist oder die
Datei geschlossen wird. Abhilfe schafft z.B. ein Aufruf von
fflush().

(2) Es gibt pro Datei eine aktuelle Position, an der gelesen
und geschrieben wird. Die verändert sich nicht von alleine.
Wenn Du Text ans Ende der Datei schreibst, ist die
Schreib-/Leseposition anschließend das Dateiende. Ein
Leseaufruf gibt dann EOF zurück. Abhilfe: z.B. Funktion
fseek() aufrufen.

(3) Die Punkte (1) und (2) können sich gegenseitig
beeinflussen.

Also:

  • nach Schreiboperationen fflush() aufrufen
  • wenn der erste Programmteil fertig ist, Datei entweder
    schließen (dadurch wird auch automatisch fflush() aufgerufen)
    und erneut öffnen, oder ein fseek() zum Dateianfang machen.

Dann sollte schon mehr passieren

Gruß,
Ralf

Hallo Peter

Hallo Kalsan,

  1. 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?

Wegen dem signextend sind die Resultate unterschiedlich.
EOF ist meistens 0xFFFF
Wird es auf 8-Bit chsr gekürzt ist der Wert 0xFF.
Wird nun unsigned char von 8 Bit auf 16 Bit erweitert ist das
Resultat 0x00FF. Bei signed char wird es zu 0xFFFF.
Der Vergleich erfolg aber mit 0xFFFF, ergibt also
unterschiedliche Resultate.
Das ganze gilt entsprechend auch für 32-Bit int. Deshalb wird
EOF normalerweise als -1 definiert, der Rest macht dann der
Compiler entsprechend den Voreinstellungen.

Bei C ist die Bitbreite abhängig von der CPU und dem Compiler.
Zudem kann man oft noch einiges über Parameter einstellen.

Garnatiert ist nur dass:
char

AAAAHHHHHHHH

Wie blöd bin ich eigentlich (und wie blöd sind wir alle)?!
Das Problem war das Folgende:

while ((zeichen != EOF)&&(zeichen!='\t'))...

Das Zeichen war aber noch EOF vom vorherigen Mal, da ja als Letztes EOF zurückgemeldet wurde!!!

vorhin „zeichen=’\0’;“ einfügen, und das Problem ist gelöst!

Aber der Tipp mit dem fflush() war torzdem sehr interessant, er half mir in anderen Situationen.

Danke an alle!!

Kalsan

Hallo Kalsan,

Garnatiert ist nur dass:
char

Hallo,

Hier hat der Bio-Scan der Quelle aber auch ergeben, dass ich
mit der Speicher-Laenge hinkomme.

Ok. Und wenn jetzt jemand eine Datei bastelt, in der ein
Farbname mit
„abcacbasdlkjhalksjdhflkajsdhjfhwuiluhasdlkjfhlakjsdhflkjahsdlkjfhalsdjkhklajsdhkljhasdlkjhaslkdjhlaksdjhfljkhlakjsdhlfkjhlkjsdh“
angegeben ist? Was passiert dann?

In dem Fall musst du dir keine Sorgen machen. Das Proggy war nur für den Eigenbedarf, für DIESE EINE Datei. Aber generell hat Du schon recht.

@Kalsan: die Lösung wäre enteder ein String-Objekt, oder eine Funktion, die die chars in eine verkettete Liste einliest, die kann dann beliebig lang sein:
http://nopaste.info/20aad7a403.html

Für C muss man halt noch die „new“ durch malloc() ersetzen.

lG
Martin B

Hallo Kalsan,

Hallo Peter

Garnatiert ist nur dass:
char

Hallo Fragewurm,

Ich hab’s nun so gemacht: Datei öffnen, schreiben, schliessen,
fflush , öffnen, lesen, schliessen.
Gleiche Wirkung.

Du hast da eine grossen Denkfehler !

*FILE ist ein Dateihandle.
Im Prinzip ist dies ein Zeiger auf eine Tabelle in welcher die Informationen zu dem Stream abgelegt sind.
Im Prinzip wird nicht grundsätzlich zwischen Dateien und z.B. einer seriellen Schnittstelle unterschieden. Allerdings machen fset() und fseek() auf dem Keyboard keinen Sinn und liefern einen Fehlerstatus.

Nun du deinem Fehler:

Wenn das Öffnen erfolgreich ist, bekommst du einen gültigen Handle zurück. Mit dem Schliessen wird dieser Handle als ungültig markiert.
dein fflush() hat somit keinerlei Wirkung und hat auch einen Fehlerstatus zurückgegeben (Sinngemäss: „ungültiges Handle“) und somit keine Wirkung gehabt.

MfG Peter(TOO)

Hallo

Dafür müsste man zuerst einmal wissen, wie der Compiler
heisst, hüstel…
Ich verwende den Standartcompiler von Code::Blocks, aber wie
heisst das Ding?!

gcc 3.4.3

Grüße

CMБ

1 Like