setvbuf
|
Definiert in Header
<stdio.h>
|
||
| (bis C99) | ||
| (seit C99) | ||
|
#define _IOFBF /*unspecified*/
#define _IOLBF /*unspecified*/
|
||
Ändert den Puffermodus des angegebenen Dateistroms
stream
wie durch das Argument
mode
angegeben. Zusätzlich,
-
Wenn
bufferein Nullzeiger ist, wird der interne Puffer aufsizevergrößert/verkleinert. -
Wenn
bufferkein Nullzeiger ist, weist der Stream an, den benutzerbereitgestellten Puffer der Größesizeabbufferzu verwenden. Der Stream muss geschlossen werden (mit fclose ), bevor die Lebensdauer des Arrays, auf dasbufferzeigt, endet. Der Inhalt des Arrays nach einem erfolgreichen Aufruf vonsetvbufist unbestimmt und jeder Versuch, es zu verwenden, ist undefiniertes Verhalten.
Inhaltsverzeichnis |
Parameter
| stream | - | der Dateistream, für den der Puffer gesetzt werden soll | ||||||
| buffer | - | Zeiger auf einen Puffer für den Stream oder Nullzeiger, um nur Größe und Modus zu ändern | ||||||
| mode | - |
Zu verwendender Puffermodus. Es kann einer der folgenden Werte sein:
|
||||||
| size | - | Größe des Puffers |
Rückgabewert
0 bei Erfolg oder ungleich Null bei Fehler.
Hinweise
Diese Funktion darf nur verwendet werden, nachdem
stream
mit einer geöffneten Datei assoziiert wurde, aber vor jeder anderen Operation (außer einem fehlgeschlagenen Aufruf von
setbuf
/
setvbuf
).
Nicht alle
size
Bytes werden zwangsläufig für die Pufferung verwendet: Die tatsächliche Puffergröße wird normalerweise auf ein Vielfaches von 2, ein Vielfaches der Seitengröße usw. abgerundet.
Auf vielen Implementierungen ist Zeilenpufferung nur für Terminal-Eingabestreams verfügbar.
Ein häufiger Fehler ist das Setzen des Puffers von stdin oder stdout auf ein Array, dessen Lebensdauer vor dem Programmende abläuft:
Die Standardpuffergröße BUFSIZ wird als die effizienteste Puffergröße für Datei-I/O auf der Implementierung erwartet, aber POSIX fstat liefert oft eine bessere Schätzung.
Beispiel
Ein Anwendungsfall für das Ändern der Puffergröße ist, wenn eine bessere Größe bekannt ist. (Dieses Beispiel verwendet einige POSIX-Funktionen, z.B.
fileno
. Siehe auch SO:
#1
und
#2
).
// Make some POSIX functions, such as `int fileno(FILE*)`, visible: #define _POSIX_SOURCE #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(void) { FILE* fp = fopen("/tmp/test.txt", "w+"); if (fp == NULL) { perror("fopen"); return EXIT_FAILURE; } struct stat stats; if (fstat(fileno(fp), &stats) == -1) // POSIX only { perror("fstat"); return EXIT_FAILURE; } printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize); if (setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0) { perror("setvbuf failed"); // POSIX version sets errno return EXIT_FAILURE; } int ch; while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to // observe the read(2) syscalls used fclose(fp); return EXIT_SUCCESS; }
Mögliche Ausgabe:
BUFSIZ is 8192, but optimal block size is 65536
Referenzen
- C17-Standard (ISO/IEC 9899:2018):
-
- 7.21.5.6 Die setvbuf-Funktion (S: 225)
- C11-Standard (ISO/IEC 9899:2011):
-
- 7.21.5.6 Die setvbuf-Funktion (S: 308)
- C99 Standard (ISO/IEC 9899:1999):
-
- 7.19.5.6 Die setvbuf-Funktion (S: 273-274)
- C89/C90 Standard (ISO/IEC 9899:1990):
-
- 4.9.5.6 Die setvbuf-Funktion
Siehe auch
|
setzt den Puffer für einen Dateistream
(Funktion) |
|
|
C++ documentation
für
setvbuf
|
|