Namensräume
Varianten
Aktionen

std::setvbuf

Von cppreference.com
< cpp‎ | io‎ | c
 
 
 
C-Style I/O
Typen und Objekte
Funktionen
Datei-Zugriff
setvbuf

Direkte Ein-/Ausgabe
Unformatierte Ein-/Ausgabe
Formatierte Eingabe
(C++11)(C++11)(C++11)    
(C++11)(C++11)(C++11)    
 
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
_IOFBF vollständige Pufferung
_IOLBF Zeilenpufferung
_IONBF keine Pufferung
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) [bearbeiten]
[virtuell]
stellt einen vom Benutzer bereitgestellten Puffer bereit oder macht diesen Filebuf unbuffered
(virtuelle geschützte Memberfunktion von std::basic_filebuf<CharT,Traits>) [edit]
C-Dokumentation für setvbuf