Namespaces
Variants

setvbuf

From cppreference.net
< c ‎ | io
Definiert in Header <stdio.h>
int setvbuf ( FILE * stream, char * buffer,
int mode, size_t size ) ;
(bis C99)
int setvbuf ( FILE * restrict stream, char * restrict buffer,
int mode, size_t size ) ;
(seit C99)
#define _IOFBF     /*unspecified*/

#define _IOLBF     /*unspecified*/

#define _IONBF     /*unspecified*/

Ändert den Puffermodus des angegebenen Dateistroms stream wie durch das Argument mode angegeben. Zusätzlich,

  • Wenn buffer ein Nullzeiger ist, wird der interne Puffer auf size vergrößert/verkleinert.
  • Wenn buffer kein Nullzeiger ist, weist der Stream an, den benutzerbereitgestellten Puffer der Größe size ab buffer zu verwenden. Der Stream muss geschlossen werden (mit fclose ), bevor die Lebensdauer des Arrays, auf das buffer zeigt, endet. Der Inhalt des Arrays nach einem erfolgreichen Aufruf von 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 zeilenweise Pufferung
_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 mit einer geöffneten Datei assoziiert wurde, aber vor jeder anderen Operation (außer einem fehlgeschlagenen Aufruf von setbuf / setvbuf ).

Nicht alle size Bytes werden zwangsläufig für die Pufferung verwendet: Die tatsächliche Puffergröße wird normalerweise 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 vor dem Programmende abläuft:

int main(void) {
    char buf[BUFSIZ];
    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. (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

  • 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.19.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 Dateistream
(Funktion)
C++ documentation für setvbuf