Namensräume
Varianten
Aktionen

setvbuf

Von cppreference.com
< c‎ | io
 
 
Datei-Ein-/Ausgabe
Typen und Objekte
        
Funktionen
Datei-Zugriff
(C95)
setvbuf

Unformatierte Ein-/Ausgabe
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Formatierte Eingabe
Direkte Ein-/Ausgabe
Formatierte Ausgabe
Dateipositionierung
Fehlerbehandlung
Operationen auf Dateien
 
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     /*nicht spezifiziert*/

#define _IOLBF     /*nicht spezifiziert*/

#define _IONBF     /*nicht spezifiziert*/

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

  • Wenn buffer ein Nullzeiger ist, wird der interne Puffer auf size geändert.
  • Wenn buffer kein Nullzeiger ist, wird der Stream angewiesen, den vom Benutzer bereitgestellten Puffer der Größe size ab buffer zu verwenden. Der Stream muss geschlossen werden (mit fclose), bevor die Lebensdauer des von buffer verwiesenen Arrays endet. Der Inhalt des Arrays nach einem erfolgreichen Aufruf von setvbuf ist unbestimmt und jeder Versuch, ihn zu verwenden, ist undefiniertes Verhalten.

Inhalt

[bearbeiten] 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 - zu verwendender Puffermodus. Es kann einer der folgenden Werte sein:
_IOFBF vollständige Pufferung
_IOLBF Zeilenpufferung
_IONBF keine Pufferung
size - Größe des Puffers

[bearbeiten] Rückgabewert

0 bei Erfolg oder einen Wert ungleich Null bei einem Fehler.

[bearbeiten] 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 setbuf/setvbuf) durchgeführt wurde.

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. gerundet.

Bei 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 dem Programmende endet.

int main(void) {
    char buf[BUFSIZ];
    setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior

Die Standardpuffergröße BUFSIZ wird als die effizienteste Puffergröße für die Datei-I/O auf der Implementierung angesehen, aber POSIX fstat liefert oft eine bessere Schätzung.

[bearbeiten] Beispiel

Ein Anwendungsfall für die Änderung 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

[bearbeiten] Referenzen

  • C17-Standard (ISO/IEC 9899:2018)
  • 7.21.5.6 The setvbuf function (S. 225)
  • C11-Standard (ISO/IEC 9899:2011)
  • 7.21.5.6 The setvbuf function (S. 308)
  • C99-Standard (ISO/IEC 9899:1999)
  • 7.19.5.6 The setvbuf function (S. 273-274)
  • C89/C90-Standard (ISO/IEC 9899:1990)
  • 4.9.5.6 The setvbuf function

[bearbeiten] Siehe auch

setzt den Puffer für einen Dateistream
(Funktion) [bearbeiten]
C++-Dokumentation für setvbuf