C-Datei-Eingabe/Ausgabe - C file input/output

Die Programmiersprache C bietet viele Standardbibliothek Funktionen für Datei Ein- und Ausgabe . Diese Funktionen machen den Großteil des C-Standardbibliothek- Headers <stdio.h> aus . Die Funktionalität stammt von einem "portable I/O Package", das von Mike Lesk in den Bell Labs in den frühen 1970er Jahren geschrieben wurde und in Version 7 offiziell Teil des Unix- Betriebssystems wurde .

Die I/O-Funktionalität von C ist nach modernen Standards ziemlich niedrig; C abstrahiert alle Dateioperationen in Operationen auf Ströme von Bytes , die „Eingangsströme“ oder „Ausgangsströme“ sein kann. Im Gegensatz zu einigen früheren Programmiersprachen bietet C keine direkte Unterstützung für Datendateien mit wahlfreiem Zugriff ; Um aus einem Datensatz in der Mitte einer Datei zu lesen, muss der Programmierer einen Stream erstellen, die Mitte der Datei suchen und dann nacheinander Bytes aus dem Stream lesen.

Das Stream-Modell der Datei-I/O wurde von Unix populär gemacht, das gleichzeitig mit der Programmiersprache C selbst entwickelt wurde. Die überwiegende Mehrheit der modernen Betriebssysteme hat Streams von Unix geerbt, und viele Sprachen der Programmiersprachenfamilie C haben die Datei-I/O-Schnittstelle von C mit wenigen oder gar keinen Änderungen geerbt (z. B. PHP ).

Überblick

Diese Bibliothek verwendet sogenannte Streams, um mit physischen Geräten wie Tastaturen, Druckern, Terminals oder anderen vom System unterstützten Dateitypen zu arbeiten. Streams sind eine Abstraktion, um mit diesen auf einheitliche Weise zu interagieren. Alle Streams haben ähnliche Eigenschaften, unabhängig von den individuellen Eigenschaften der physischen Medien, denen sie zugeordnet sind.

Funktionen

Die meisten der C-Datei-Eingabe-/Ausgabefunktionen sind in <stdio.h> (oder im C++-Header cstdio , der die Standard-C-Funktionalität enthält, aber im std- Namespace enthält ) definiert.

Byte-
Zeichen
Breiter
Charakter
Beschreibung
Dateizugriff fopen Öffnet eine Datei (mit einem Nicht-Unicode-Dateinamen unter Windows und einem möglichen UTF-8-Dateinamen unter Linux)
freopen Öffnet eine andere Datei mit einem vorhandenen Stream
erröten Synchronisiert einen Ausgabestream mit der aktuellen Datei
fschließen Schließt eine Datei
setbuf Setzt den Puffer für einen Dateistream
setvbuf Legt den Puffer und seine Größe für einen Dateistream fest
fweit Schaltet einen Dateistream zwischen Breitzeichen-E/A und Schmalzeichen-E/A um
Direkte
Ein-/Ausgabe
fread Liest aus einer Datei
fschreiben Schreibt in eine Datei
Unformatierte
Ein-/Ausgabe
fgetc
getc
fgetwc
getwc
Liest ein Byte/ wchar_t aus einem Dateistream
fgets fgetws Liest eine byte/ wchar_t- Zeile aus einem Dateistream
fputc
putc
fputwc
putwc
Schreibt ein Byte/ wchar_t in einen Dateistream
fputs fputws Schreibt einen byte/ wchar_t- String in einen Dateistream
getchar getwchar Liest ein Byte/ wchar_t von stdin
bekommt N / A Liest einen Byte-String von stdin, bis ein Zeilenumbruch oder ein Dateiende gefunden wird (veraltet in C99, entfernt aus C11)
putchar putwchar Schreibt ein Byte/ wchar_t nach stdout
legt N / A Schreibt einen Byte-String nach stdout
ungetc ungetwc Fügt ein Byte/ wchar_t zurück in einen Dateistream
Formatierte
Ein-/Ausgabe
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
Liest formatierte Byte/ wchar_t- Eingaben von stdin,
einem Dateistream oder einem Puffer
vscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
Liest formatiertes Eingabebyte/ wchar_t aus stdin,
einem Dateistream oder einem Puffer mithilfe einer variablen Argumentliste
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
Gibt formatierte byte/ wchar_t- Ausgabe auf stdout,
einen Dateistream oder einen Puffer aus
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
Gibt formatierte byte/ wchar_t- Ausgabe auf stdout,
einen Dateistream oder einen Puffer mit variabler Argumentliste aus
Fehler N / A Schreibt eine Beschreibung des aktuellen Fehlers nach stderr
Dateipositionierung ftell
ftello
Gibt die aktuelle Dateipositionsanzeige zurück
fseek
fseeko
Verschiebt die Dateipositionsanzeige an eine bestimmte Stelle in einer Datei
fgetpos Ruft die Dateipositionsanzeige ab
fsetpos Verschiebt die Dateipositionsanzeige an eine bestimmte Stelle in einer Datei
zurückspulen Verschiebt die Dateipositionsanzeige an den Anfang einer Datei

Fehlerbehandlung
klarerr Löscht Fehler
feof Prüft auf das Dateiende
ferror Prüft auf einen Dateifehler
Vorgänge
an Dateien
Löschen Löscht eine Datei
umbenennen Benennt eine Datei um
tmpfile Gibt einen Zeiger auf eine temporäre Datei zurück
tmpnam Gibt einen eindeutigen Dateinamen zurück

Konstanten

Zu den im Header <stdio.h> definierten Konstanten gehören:

Name Anmerkungen
EOF Eine negative ganze Zahl vom Typ int, die verwendet wird, um Dateiendebedingungen anzugeben
BUFSIZ Eine ganze Zahl, die der Größe des Puffers entspricht, der von der Funktion setbuf() verwendet wird
FILENAME_MAX Die Größe eines char- Arrays, das groß genug ist, um den Namen jeder Datei zu speichern, die geöffnet werden kann
FOPEN_MAX Die Anzahl der Dateien, die gleichzeitig geöffnet sein können; wird mindestens acht sein
_IOFBF Abkürzung für "input/output full buffered"; es ist eine ganze Zahl , die auf die übergeben werden kann setvbuf () Funktion Anforderungsblock gepufferten Eingang und Ausgang für einen offenen Stream
_IOLBF Eine Abkürzung für "input/output line buffered"; es ist eine ganze Zahl , die auf die übergeben werden kann setvbuf () Funktion Anforderungsleitung gepufferten Eingang und Ausgang für einen offenen Stream
_IONBF Abkürzung für "input/output not buffered"; Es ist eine ganze Zahl, die an die Funktion setvbuf() übergeben werden kann, um ungepufferte Ein- und Ausgaben für einen offenen Stream anzufordern
L_tmpnam Die Größe eines char- Arrays, das groß genug ist, um einen temporären Dateinamen zu speichern, der von der Funktion tmpnam() generiert wurde
NULL Ein Makro, das auf die Nullzeigerkonstante erweitert wird; das heißt, eine Konstante, die einen Zeigerwert darstellt, der garantiert keine gültige Adresse eines Objekts im Speicher ist
SEEK_CUR Eine ganze Zahl, die an die Funktion fseek() übergeben werden kann, um eine Positionierung relativ zur aktuellen Dateiposition anzufordern
SEEK_END Eine ganze Zahl, die an die Funktion fseek() übergeben werden kann, um eine Positionierung relativ zum Ende der Datei anzufordern
SEEK_SET Eine ganze Zahl, die an die Funktion fseek() übergeben werden kann, um eine Positionierung relativ zum Anfang der Datei anzufordern
TMP_MAX Die maximale Anzahl eindeutiger Dateinamen, die von der Funktion tmpnam() generiert werden können; wird mindestens 25 . sein

Variablen

Stdstreams-notitle.svg

Zu den im Header <stdio.h> definierten Variablen gehören:

Name Anmerkungen
stdin Ein Zeiger auf eine DATEI, der auf den Standardeingabestrom verweist, normalerweise eine Tastatur.
stdout Ein Zeiger auf eine DATEI, der auf den Standardausgabestrom verweist, normalerweise ein Anzeigeterminal.
stderr Ein Zeiger auf eine DATEI, der auf den Standardfehlerstrom verweist, oft ein Anzeigeterminal.

Mitgliedstypen

Zu den im Header <stdio.h> definierten Datentypen gehören:

  • DATEI – auch bekannt als afile handle , dies ist ein undurchsichtiger Typ , der die Informationen über eine Datei oder einen Textstream enthält, die erforderlich sind, um Eingabe- oder Ausgabeoperationen auszuführen, einschließlich:
    • plattformspezifische Kennung des zugehörigen I/O-Geräts, z. B. ein Dateideskriptor
    • der Puffer
    • Stream-Ausrichtungsanzeige (unscharf, schmal oder breit)
    • Statusanzeige für die Streampufferung (ungepuffert, zeilengepuffert, vollständig gepuffert)
    • E/A-Modusanzeige (Eingabestream, Ausgabestream oder Aktualisierungsstream)
    • Binär-/Textmodusanzeige
    • End-of-File-Anzeige
    • Fehleranzeige
    • die aktuelle Streamposition und den Multibyte-Konvertierungsstatus (ein Objekt vom Typ mbstate_t)
    • Wiedereintrittssperre (ab C11 erforderlich )
  • fpos_t – ein Nicht-Array-Typ, der die Position jedes Bytes in einer Datei und jeden Konvertierungszustand, der in allen unterstützten Multibyte-Zeichenkodierungen auftreten kann, eindeutig identifizieren kann
  • size_t – ein vorzeichenloser Integer- Typ, der der Typ des Ergebnisses des sizeof- Operators ist.

Erweiterungen

Der POSIX- Standard definiert mehrere Erweiterungen von stdio in seinen Basisdefinitionen , darunter eine readline- Funktion, die Speicher zuweist , die fileno- und fdopen- Funktionen, die die Verbindung zwischen FILE- Objekten und Dateideskriptoren herstellen , und eine Gruppe von Funktionen zum Erstellen von FILE- Objekten, die auf zu In-Memory-Puffer.

Beispiel

Das folgende C-Programm öffnet eine Binärdatei namens myfile , liest fünf Byte daraus und schließt die Datei dann.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char buffer[5];
    FILE* fp = fopen("myfile", "rb");

    if (fp == NULL) {
        perror("Failed to open file \"myfile\"");
        return EXIT_FAILURE;
    }

    for (int i = 0; i < 5; i++) {
        int rc = getc(fp);
        if (rc == EOF) {
            fputs("An error occurred while reading the file.\n", stderr);
            return EXIT_FAILURE;
        }
        
        buffer[i] = rc;
    }

    fclose(fp);

    printf("The bytes read were... %x %x %x %x %x\n", buffer[0], buffer[1],
        buffer[2], buffer[3], buffer[4]);

    return EXIT_SUCCESS;
}

Alternativen zu stdio

Mehrere Alternativen zu stdio wurden entwickelt. Dazu gehört die C++ iostream- Bibliothek, die Teil des ISO C++-Standards ist . ISO C++ erfordert weiterhin die stdio- Funktionalität.

Andere Alternativen umfassen die SFIO-Bibliothek (A Safe/Fast I/O Library) von AT&T Bell Laboratories . Diese 1991 eingeführte Bibliothek zielte darauf ab, Inkonsistenzen, unsichere Praktiken und Ineffizienzen beim Design von stdio zu vermeiden . Zu seinen Funktionen gehört die Möglichkeit, Callback-Funktionen in einen Stream einzufügen , um die Handhabung von Daten, die aus dem Stream gelesen oder in den Stream geschrieben werden, anzupassen. Es wurde 1997 für die Außenwelt freigegeben, und die letzte Veröffentlichung war der 1. Februar 2005.

Siehe auch

Verweise

Externe Links