std::setvbuf
| Definiert in Header <cstdio> |
||
| int setvbuf( std::FILE* stream, char* buffer, int mode, std::size_t size ); |
||
Ändert den Pufferungsmodus des angegebenen Dateistreams stream, wie durch das Argument mode angegeben. Zusätzlich,
- Wenn buffer ein Nullzeiger ist, wird der interne Puffer auf size vergrößert.
- Wenn buffer kein Nullzeiger ist, wird der Stream angewiesen, den vom Benutzer bereitgestellten Puffer der Größe size zu verwenden, beginnend bei buffer. Der Stream muss geschlossen werden (mit std::fclose), bevor die Lebensdauer des von buffer zeigenden Arrays endet. Der Inhalt des Arrays nach einem erfolgreichen Aufruf von std::setvbuf ist unbestimmt, und jeder Versuch, ihn zu verwenden, ist undefiniertes Verhalten.
Inhalt |
[edit] 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 | - | Pufferungsmodus, der verwendet werden soll. Es kann einer der folgenden Werte sein
| ||||||
| size | - | Größe des Puffers |
[edit] Rückgabewert
0 bei Erfolg oder eine Nicht-Null-Zahl bei Fehler.
[edit] 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 std::setbuf/std::setvbuf) stattgefunden hat.
Nicht alle size Bytes werden notwendigerweise zur 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 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 Beendigung des Programms endet.
int main() { char buf[BUFSIZ]; std::setbuf(stdin, buf); } // lifetime of buf ends, undefined behavior
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.
[edit] Beispiel
Ein Anwendungsfall für die Änderung 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
[edit] Siehe auch
| setzt den Puffer für einen Dateistream (function) | |
| [virtuell] |
stellt einen vom Benutzer bereitgestellten Puffer bereit oder macht diesen Filebuf unbuffered (virtuelle geschützte Memberfunktion von std::basic_filebuf<CharT,Traits>) |
| C-Dokumentation für setvbuf
| |