setvbuf
| Definiert in Header <stdio.h>
|
||
int setvbuf( FILE* stream, char* buffer,
int mode, size_t size );
|
||
int setvbuf( FILE* restrict stream, char* restrict buffer,
int mode, size_t size );
|
(bis C99) | |
#define _IOFBF /* unspecified */
#define _IOLBF /* unspecified */
#define _IONBF /* unspecified */
|
||
(seit C99)streamÄndert den Puffermodus des angegebenen Dateistroms mode wie durch das Argument
- angegeben. Zusätzlich,
bufferFallssizeein Nullzeiger ist, wird der interne Puffer auf - vergrößert.
bufferFallssizekein Nullzeiger ist, wird der Strom angewiesen, den vom Benutzer bereitgestellten Puffer der Größebufferab zu verwenden. Der Strom muss geschlossen werden (mit fclose) bevor die Lebensdauerbufferdes Arrays, auf dassetvbufzeigt, endet. Der Inhalt des Arrays nach einem erfolgreichen Aufruf von
Siehe auch
| stream | - | der Dateistrom, für den der Puffer gesetzt werden soll | ||||||
| buffer | - | Zeiger auf einen Puffer für den Strom 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 verknüpft wurde, aber vor jeder anderen Operation (außer einem fehlgeschlagenen Aufruf von setbuf/setvbuf).
Nicht alle size Bytes werden notwendigerweise für die Pufferung verwendet: Die tatsächliche Puffergröße wird normalerweise auf ein Vielfaches von 2, ein Vielfaches der Seitengröße usw. abgerundet.
In 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 Programmende endet:
int main(void)
{
char buf[BUFSIZ];
setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior
Die standardmäßige Puffergröße BUFSIZ gilt als die effizienteste Puffergröße für Datei-E/A in der Implementierung, aber POSIX fstat bietet oft eine bessere Schätzung.
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
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
- 7.21.5.6 Die setvbuf-Funktion (S.: TBD)
- 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.21.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 Dateistrom (Funktion) | |
C++-Dokumentation für setvbuf
| |