Namespaces
Variants

setvbuf

Von de.cppreference.net
< c | io
 
 
Datei-Eingabe/-Ausgabe
Typen und Objekte
        
Funktionen
Dateizugriff
(C95)
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 );
int setvbuf( FILE* restrict stream, char* restrict buffer,
             int mode, size_t size );
(bis C99)
#define _IOFBF     /* unspecified */
#define _IOLBF     /* unspecified */
#define _IONBF     /* unspecified */

(seit C99)streamÄndert den Puffermodus des angegebenen Dateistroms mode wie durch das Argument

  • angegeben. Zusätzlich, bufferFalls size ein Nullzeiger ist, wird der interne Puffer auf
  • vergrößert.bufferFalls size kein Nullzeiger ist, wird der Strom angewiesen, den vom Benutzer bereitgestellten Puffer der Größe buffer ab zu verwenden. Der Strom muss geschlossen werden (mit fclose) bevor die Lebensdauerbuffer des Arrays, auf das setvbuf zeigt, endet. Der Inhalt des Arrays nach einem erfolgreichen Aufruf von

Siehe auch

stream - der Dateistrom, für den der Puffer gesetzt werden soll
buffer - Zeiger auf einen Puffer für den Strom 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 mit einer geöffneten Datei verknüpft wurde, aber vor jeder anderen Operation (außer einem fehlgeschlagenen Aufruf von setbuf/setvbuf).

Nicht alle size Bytes werden notwendigerweise für die 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 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 Programmende endet:

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

Die standardmäßige Puffergröße BUFSIZ gilt als die effizienteste Puffergröße für Datei-E/A in der Implementierung, aber POSIX fstat bietet oft eine bessere Schätzung.

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

Referenzen

  • C23-Standard (ISO/IEC 9899:2024):
  • 7.21.5.6 Die setvbuf-Funktion (S.: TBD)
  • 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.21.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 Dateistrom
(Funktion)
C++-Dokumentation für setvbuf