ein Kapitel zurück                                           ein Kapitel weiter

Jetzt kommen wir noch zu weiteren Funktionen zum Lesen und Schreiben in eine Datei oder Standard - E/A. Zuerst die Funktionen zum Lesen...

char *gets(char *puffer);
char *fgets(char *puffer, int n, FILE *datei);

Mit gets/fgets können sie Zeilenweise, bis zum nächsten Newlinezeichen also, in die Adresse von puffer mit abschließenden '\0' schreiben. Einfach Ausgedrückt wir können Zeilenweise einlesen. Mit gets lesen wir von der Standardeingabe (stdin) ein....

/*Download:gets.c*/
#include <stdio.h> int main() { char text[20]; gets(text); printf("%s",text); return 0; }

Auf Linux wird Ihnen Ihr Compiler, vernünftigerweise, eine Warnung wie....

...the 'gets' function is dangerous an should not be used!

Die Warnung diese Funktion nicht zu verwenden ist ja ok, aber vielleicht sollte, für Anfängern, auch noch Alternativen angegeben werden (IMHO)! Da gets nicht die Anzahl der einzugegenden Zeichen überprüft, kann dies zu einem Pufferüberlauf (Buffer Overflow). Aus diesem Grund sollten sie auf keinen Fall auf gets, sondern auf die Funktion fgets zurückgreifen. Zum Thema Buffer Overflow finden sie in einem der hinteren Kapiteln etwas!

Wenn sie den Syntax von fgets ansehen, finden sie außer der Zieladresse in der wir die Daten einlesen noch einen Stream (FILE Zeiger) und einen Integer-Wert, der die Anzahl der einzulesenden Zeichen festlegt. Somit wird nun mit fgets n-Zeichen oder bis zum nächsten Newline ('\n'), aus dem Stream (FILE *) in die Adresse von puffer gelesen. Wobei der Stream wieder jede von Ihnen geöffnete Datei sein kann, oder auch die Standardeingabe (stdin). Hier nun unser Beispiel von zuvor mit fgets....

/*Download:fgets.c*/
#include <stdio.h> #define MAX 20 int main() { char text[MAX]; fgets(text,MAX,stdin); printf("%s",text); return 0; }

Wenn sie jetzt mehr wie 20 Zeichen eingeben wird das Programm anstandslos laufen. Es werden auch nur 20 Zeichen bzw. 19 Zeichen + '\n' an die Variable text übergeben. Weiterer Vorteil von fgets ist das Automatisch am Ende der gelesenen Zeichenkette ein '\n' gehängt wird. Und noch ein weiterer Vorteil und eigentlich auch der Sinn der Kapitels Datei I/O das mit fgets nicht nur von stdin gelesen werden kann sondern auch von einer Datei. Nun ein Beispiel wie wir fgets auf eine Datei anwenden...

/*Download:fgets2.c*/
#include <stdio.h> #include <stdlib.h> #define ZEILENLAENGE 80 int main() { FILE *quelle; char puffer[ZEILENLAENGE]; char name[20]; printf("Welche Datei wollen sie zu lesen oeffnen: "); scanf("%s",name); if((quelle=fopen(name,"r")) == NULL) { fprintf(stderr,"Kann %s nicht oeffnen\n",name); exit (0); } while(fgets(puffer,ZEILENLAENGE,quelle)) fputs(puffer,stdout); return 0; }

Sie können an diesem Programm sehen wie simpel die Funktion fgets anzuwenden ist. Sie können mit fgets auch die Zeilenlänge bestimmen die gelesen werden soll. Ich habe hier auch schon mal die Funktion fputs benutzt.

Kommen wir gleich zu den Funktionen zum Schreiben einer ganzen Zeile. Mit puts könne sie eine ganze Zeile auf dem Bildschirm (stdout) ausgeben. Außerdem gibt puts am Ende der Zeichenkette noch ein '\n' aus was fputs nicht tut. Im Gegensatz zu puts, verwendet fputs, wie schon fgets, einen Stream auf den geschrieben wird. Ebenso wie fgets verwendet fputs eine Zeichenbegrenzung die auf in den Stream geschrieben werden. Als Stream ist wieder jede Datei zulässig die mit einem Schreibmodus geöffnet wurden, oder auch die Standardausgabe (stdout). Hier der Syntax dieser beiden Funktionen.....

int puts(const char *puffer);
int fputs(const char *puffer, FILE *datei);

Auch hierzu ein kleines Beispiel. Wir wollen beide Funktionen (puts und fputs) gleichzeitig verwenden...

/*Download:puts.c*/
#include <stdio.h> #include <stdlib.h> #define ZEILENLAENGE 80 int main() { FILE *quelle,*kopie; char puffer[ZEILENLAENGE]; char name[20]; printf("Welche Datei wollen sie zu lesen oeffnen: "); scanf("%s",name); if((quelle=fopen(name,"r")) == NULL) { fprintf(stderr,"Kann %s nicht oeffnen\n",name); exit (0); } if((kopie=fopen("kopie.txt","w")) == NULL) { fprintf(stderr,"Kann kopie.txt nicht oeffnen\n"); exit (1); } while(fgets(puffer,ZEILENLAENGE,quelle)) { fputs(puffer,kopie); puts(puffer); } return 0; }

fputs benutzen wir hier um den Puffer den wir mit fgets ausgelesen haben in eine Datei Namens "kopie.txt" schreiben die wir mit dem FILE - Zeiger kopie geöffnet haben. puts benutzen wir hier um den Puffer auf dem Bildschirm auszugeben. Somit schreiben wir praktisch eine Zeile in die Datei "kopie.txt" und anschließend schreiben wir die selbe Zeile auf dem Bildschirm.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf