std:: setvbuf
|
Definiert in Header
<cstdio>
|
||
|
int
setvbuf
(
std::
FILE
*
stream,
char
*
buffer,
int
mode,
std::
size_t
size
)
;
|
||
Ändert den Puffermodus des gegebenen Dateistroms stream wie durch das Argument mode angegeben. Zusätzlich,
- Wenn buffer ein Nullzeiger ist, ändert die Größe des internen Puffers auf size .
- Wenn buffer kein Nullzeiger ist, weist den Stream an, den benutzerbereitgestellten Puffer der Größe size ab buffer zu verwenden. Der Stream muss geschlossen werden (mit std::fclose ), bevor die Lebensdauer des Arrays, auf das buffer zeigt, endet. Der Inhalt des Arrays nach einem erfolgreichen Aufruf von std::setvbuf ist 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
einer geöffneten Datei zugeordnet wurde, jedoch vor jedem anderen Vorgang (außer einem fehlgeschlagenen Aufruf von
std::setbuf
/
std::setvbuf
).
Nicht alle size Bytes werden zwangsläufig für die Pufferung verwendet: Die tatsächliche Puffergröße wird in der Regel 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 endet, bevor das Programm beendet wird:
int main() { char buf[BUFSIZ]; std::setbuf(stdin, buf); } // Lebensdauer von buf endet, undefiniertes Verhalten
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.
#include <cstdio> #include <cstdlib> #include <iostream> #include <sys/stat.h> int main() { std::FILE* fp = std::fopen("/tmp/test.txt", "w+"); if (!fp) { std::perror("fopen"); return EXIT_FAILURE; } struct stat stats; if (fstat(fileno(fp), &stats) == -1) // POSIX only { std::perror("fstat"); return EXIT_FAILURE; } std::cout << "BUFSIZ is " << BUFSIZ << ", but optimal block size is " << stats.st_blksize << '\n'; if (std::setvbuf(fp, nullptr, _IOFBF, stats.st_blksize) != 0) { std::perror("setvbuf failed"); // POSIX version sets errno return EXIT_FAILURE; } // Read entire file: use truss/strace to observe the read(2) syscalls used for (int ch; (ch = std::fgetc(fp)) != EOF;) {} std::fclose(fp); return EXIT_SUCCESS; }
Mögliche Ausgabe:
BUFSIZ is 8192, but optimal block size is 65536
Siehe auch
|
setzt den Puffer für einen Dateistream
(Funktion) |
|
|
[virtual]
|
stellt einen benutzerdefinierten Puffer bereit oder deaktiviert die Pufferung für diesen Filebuf
(virtuelle geschützte Memberfunktion von
std::basic_filebuf<CharT,Traits>
)
|
|
C-Dokumentation
für
setvbuf
|
|