setvbuf
| Definiert in Header <stdio.h> |
||
| (bis C99) | ||
| (seit C99) | ||
| #define _IOFBF /*nicht spezifiziert*/ #define _IOLBF /*nicht spezifiziert*/ |
||
Ändert den Puffermodus des angegebenen Dateistreams stream wie durch das Argument mode angegeben. Zusätzlich,
- Wenn
bufferein Nullzeiger ist, wird der interne Puffer aufsizegeändert. - Wenn
bufferkein Nullzeiger ist, wird der Stream angewiesen, den vom Benutzer bereitgestellten Puffer der Größesizeabbufferzu verwenden. Der Stream muss geschlossen werden (mit fclose), bevor die Lebensdauer des vonbufferverwiesenen Arrays endet. Der Inhalt des Arrays nach einem erfolgreichen Aufruf vonsetvbufist unbestimmt und jeder Versuch, ihn zu verwenden, ist undefiniertes Verhalten.
Inhalt |
[bearbeiten] Parameter
| stream | - | Der zu konfigurierende Dateistream | ||||||
| buffer | - | Zeiger auf einen Puffer, den der Stream verwenden soll, 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 |
[bearbeiten] Rückgabewert
0 bei Erfolg oder einen Wert ungleich Null bei einem Fehler.
[bearbeiten] Hinweise
Diese Funktion darf nur verwendet werden, nachdem stream mit einer geöffneten Datei verknüpft wurde, aber bevor irgendeine andere Operation (außer einem fehlgeschlagenen Aufruf von setbuf/setvbuf) durchgeführt wurde.
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. gerundet.
Bei vielen Implementierungen ist die 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 endet.
Die Standardpuffergröße BUFSIZ wird als die effizienteste Puffergröße für die Datei-I/O auf der Implementierung angesehen, aber POSIX fstat liefert oft eine bessere Schätzung.
[bearbeiten] Beispiel
Ein Anwendungsfall für die Änderung 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
[bearbeiten] Referenzen
- C17-Standard (ISO/IEC 9899:2018)
- 7.21.5.6 The setvbuf function (S. 225)
- C11-Standard (ISO/IEC 9899:2011)
- 7.21.5.6 The setvbuf function (S. 308)
- C99-Standard (ISO/IEC 9899:1999)
- 7.19.5.6 The setvbuf function (S. 273-274)
- C89/C90-Standard (ISO/IEC 9899:1990)
- 4.9.5.6 The setvbuf function
[bearbeiten] Siehe auch
| setzt den Puffer für einen Dateistream (Funktion) | |
| C++-Dokumentation für setvbuf
| |