Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » fflush

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
10.10.2003, 10:40 Uhr
geissbock



hi!

ich versteh nicht was fflush macht. habe mal eine erklärung rausgesucht. vielleicht hilft euch das ja.

Code:
[b]fflush[/b]
#include <stdio.h>

Prototyp:
int fflush(FILE *fp);

Rückgabewert:
Fehlerfall: EOF; andernfalls: 0

Beschreibung:
überträgt den Inhalt des Dateipuffers:
Schreibmodus:
Dateipuffer wird geschrieben
Lesemodus :
Puffer wird geleert

Beispiel:
if (fflush(fp) == EOF)
printf("Puffer nicht geschrieben\n");



mfg geissbock


Bearbeitung von loddab:
Ich war mal so frei und hab code-Tags gesetzt

Dieser Post wurde am 10.10.2003 um 10:56 Uhr von Loddab editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
10.10.2003, 10:52 Uhr
geissbock



ok. ich glaub ich habe es. kann es sein das normalerweise nach einem fprintf die daten noch nicht in die datei gechrieben werden sondern erst nach dem programmende? mit dem fflush wird der buffer aber gleich in die datei geschrieben oder?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
10.10.2003, 10:55 Uhr
geissbock



da hätte ich aber noch eine frage zu dieser art thema:

(void) fprintf(stderr,....)

wozu kann man void davor schreiben und weshalb in klammern?
nach '(' kommt doch normalerweise der dateiname in dem das geschrieben werden soll? stderr ist aber nun kein dateiname! was hat das für einen hintergrund?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
10.10.2003, 11:08 Uhr
Pablo
Supertux
(Operator)


fflush hat diese Aufgabe, wie du sagtest. Mir ist schon passiert, dass ich zuerst fflush(stderr); angeben muss, bevor ich fprintf(stderr,.... benutze.

Das mit dem (void) weiß ich nicht. fprintf gibt die Zahl der gedruckten Zeichen zurück. Ich weiß aber nicht, wozu man dier mit void castet.

Der Prototyp der Ellipse fprint ist:


C++:
int fprintf(FILE *stream, const char *format, ...);



Irgendwo (nach C99) steht folgendes in stdio.h:

C++:
/* Standard streams.  */
extern FILE *stdin;             /* Standard input stream.  */
extern FILE *stdout;            /* Standard output stream.  */
extern FILE *stderr;            /* Standard error output stream.  */
/* C89/C99 say they're macros.  Make them happy.  */
#define stdin stdin
#define stdout stdout
#define stderr stderr



stderr ist keine Dateiname, aber ein Pointer auf eine FILE Struct. Und stderr ist nämlich standard error buffer, wo man die Fehler ausgeben kann, usw. Da printf stdout als Standard nimmt, kann man in stderr nicht mit printf schreiben. fprintf dagegen fragt, wo man was schreiben will. Und stdin, stdout und stderr sind nämlich gültige FILE Pointers.


Zitat:
geissbock postete

nach '(' kommt doch normalerweise der dateiname in dem das geschrieben werden soll? stderr ist aber nun kein dateiname! was hat das für einen hintergrund?



Das stimmt nicht, wenn du fprintf benutzt dann musst du einen Pointer auf eine FILE Struct übergeben, der vorher mit fopen erstellt wurde.

C++:
FILE *fopen(const char *path, const char *mode);


Ist das Prototyp von fopen.

Aber du kannst auch stdin, stdout und stderr nehmen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 10.10.2003 um 11:09 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
10.10.2003, 11:33 Uhr
geissbock




Zitat:
Pablo Yanez Trujillo postete

Der Prototyp der Ellipse fprint ist:
...



was ist eine ellipse?
ich denke mal das hat nichts mit der geometrischen ellipse zu tun!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
10.10.2003, 11:49 Uhr
virtual
Sexiest Bit alive
(Operator)


Mein Senf dazu:


Zitat:
geissbock postete
ok. ich glaub ich habe es. kann es sein das normalerweise nach einem fprintf die daten noch nicht in die datei gechrieben werden sondern erst nach dem programmende? mit dem fflush wird der buffer aber gleich in die datei geschrieben oder?


Jain.
Die Dateihandles in C (also diese Dinger, die Dir fopen zurückliefert), können gepuffert sein. Da es sehr teuer wäre, jedesmal, wenn Du was schreibst, direkt auf Festplatte/Bildschirm zu schreiben (da sind je jede Menge Hardwarekomponenten und Betriebssystemebenen involviert), verfügt jedes Dateihandel über einen Puffer. ein printf etwa schreibt erst in diesen Puffer und wenn der voll ist, dann wird der Puffer automatisch gefluscht, also der Inhalt wird dahin geschrieben, wo er letztlich landen soll. Dies geschieht also nicht erst bei Programmende (da natürlich auch), sondern immer dann, wenn der Puffer voll ist, das Dateihandle geschlossen wird, oder aber fflush aufgerufen wird.

Man kann die Pufferung einstellen, dh den Puffer ganz ausstellen oder den Puffer vergrößern/verkleinern (übliche Werte für die Puffergröße liegen bei 4 oder 8 KB Speicher).

Zu beachten sind ein paar Feinheiten:
1. Entgegengesetzt landläufiger Meinung ist es nicht möglich, eine Eingabedatei, etwa stdin, zu flushen. Man findet oft den Hinweis auf die Frage "Wie kann ich verhindern, daß in stdin noch garbage steht, bevor ich mein scanf mache?" die falsche Antwort: "Mach ein fflush(stdin)". Das funktioniert nicht portabel und nur auf Rechnern, die vom Windowsvirus befallen sind (und da auch nur dann, wenn Windows funktioniert ).

2. Beim Programmstart ist stderr immer ungepuffert. Das aus gutem Grund: stderr dient dazu Fehlermeldung auszugeben. Und wenn man die puffern würde und es würde nicht geflusht bevor das Programm aufgrund eines Absturzes den Abgang macht, könnte man die Fehlermeldung niemals sehen.

3. Man kann mit setvbuf (oder dem weniger Flexiblen setbuf) Die Puffergröße ändern oder diese ausstellen. Es ist aber davon abzuraten, dies auf stderr oder stdout anzuwenden, solange man nicht genau weiiß, was man tut. Aber man sollte eigentlich immer wissen, was man tut
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
10.10.2003, 11:51 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
geissbock postete
da hätte ich aber noch eine frage zu dieser art thema:

(void) fprintf(stderr,....)

wozu kann man void davor schreiben und weshalb in klammern?
nach '(' kommt doch normalerweise der dateiname in dem das geschrieben werden soll? stderr ist aber nun kein dateiname! was hat das für einen hintergrund?


Ist überflüssig, findet man noch in hauotsächlich altem Source. Die printf Funktionen geben normalerweise die Anzahl der geschriebenen Zeichen zurück; diese schreibweise ob soll signalisieren, daß man sich dafür nicht interessiert.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
10.10.2003, 11:52 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
geissbock postete
was ist eine ellipse?
ich denke mal das hat nichts mit der geometrischen ellipse zu tun!
[/i]

www.fun-soft.de/showtopic.php?threadid=4512&time=1065778326
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
10.10.2003, 12:06 Uhr
geissbock




Zitat:
Pablo Yanez Trujillo postete

Irgendwo (nach C99) steht folgendes in stdio.h:

C++:
/* Standard streams.  */
extern FILE *stdin;             /* Standard input stream.  */
extern FILE *stdout;            /* Standard output stream.  */
extern FILE *stderr;            /* Standard error output stream.  */
/* C89/C99 say they're macros.  Make them happy.  */
#define stdin stdin
#define stdout stdout
#define stderr stderr






wo kann ich das nachlesen

danke für eure ausführliche eklärung. ich wusste das ich auf euch zählen kann und ihr mir weiterhelfen könnt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
10.10.2003, 12:18 Uhr
Pablo
Supertux
(Operator)


Ich habe meine stdio.h Datei geöffnet und geguckt, was alles so deklariert wurde, und dann bin ich da gestolpert und hat mich tot gelacht, wegen "Make them happy".
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: