Namespaces
Variants

std:: setvbuf

From cppreference.net
< cpp ‎ | io ‎ | c
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:
_IOFBF vollständige Pufferung
_IOLBF Zeilenpufferung
_IONBF keine Pufferung
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