Wejście/wyjście pliku C - C file input/output

Język programowania C dostarcza wielu standardowych funkcji bibliotecznych do wprowadzania i wyprowadzania plików . Te funkcje stanowią większość nagłówka standardowej biblioteki C <stdio.h> . Funkcjonalność wywodzi się z "przenośnego pakietu I/O" napisanego przez Mike'a Leska w Bell Labs we wczesnych latach 70-tych i oficjalnie stała się częścią systemu operacyjnego Unix w wersji 7 .

Funkcjonalność we/wy C jest dość niska według nowoczesnych standardów; C abstracts wszystkie operacje pliku do operacji na strumienie z bajtów , które mogą być „wejściowych strumieni” lub „strumieni wyjścia”. W przeciwieństwie do niektórych wcześniejszych języków programowania, C nie ma bezpośredniego wsparcia dla plików danych o dostępie swobodnym ; aby odczytać z rekordu w środku pliku, programista musi utworzyć strumień, szukać środka pliku, a następnie czytać kolejno bajty ze strumienia.

Strumieniowy model wejścia/wyjścia plików został spopularyzowany przez Unix, który był rozwijany równolegle z samym językiem programowania C. Ogromna większość nowoczesnych systemów operacyjnych odziedziczyła strumienie z Uniksa, a wiele języków z rodziny języków programowania C odziedziczyło interfejs we/wy plików C z niewielkimi zmianami (na przykład PHP ).

Przegląd

Ta biblioteka wykorzystuje tak zwane strumienie do pracy z urządzeniami fizycznymi, takimi jak klawiatury, drukarki, terminale lub z dowolnym innym typem plików obsługiwanym przez system. Strumienie są abstrakcją, która oddziałuje z nimi w jednolity sposób. Wszystkie strumienie mają podobne właściwości niezależnie od indywidualnych cech fizycznych nośników, z którymi są powiązane.

Funkcje

Większość funkcji wejścia/wyjścia pliku C jest zdefiniowana w <stdio.h> (lub w nagłówku C++ cstdio , który zawiera standardową funkcjonalność C, ale w przestrzeni nazw std ).


Znak bajtowy
Szeroki
charakter
Opis
Dostęp do plików fopen Otwiera plik (z nazwą pliku inną niż Unicode w systemie Windows i możliwą nazwą pliku UTF-8 w systemie Linux)
swobodnie otwierać Otwiera inny plik z istniejącym strumieniem
spłukać Synchronizuje strumień wyjściowy z rzeczywistym plikiem
fzamknij Zamyka plik
setbuf Ustawia bufor dla strumienia plików
setvbuf Ustawia bufor i jego rozmiar dla strumienia plików
fwide Przełącza strumień plików między We/Wy o szerokich znakach i We/Wy o wąskich znakach
Bezpośrednie
wejście/wyjście
przestraszony Czyta z pliku
fwrite Zapisuje do pliku
Niesformatowane
wejście/wyjście
fgetc
getc
fgetwc
getwc
Czyta bajt/ wchar_t ze strumienia plików
fgets fgetws Czyta wiersz bajt/ wchar_t ze strumienia pliku
fputc
putc
fputwc
putwc
Zapisuje bajt/ wchar_t do strumienia plików
fputs fputws Zapisuje ciąg bajtów/ wchar_t do strumienia plików
dostaćchar getwchar Czyta bajt/ wchar_t z stdin
dostaje Nie dotyczy Czyta ciąg bajtów z stdin do momentu napotkania nowej linii lub końca pliku (przestarzałe w C99, usunięte z C11)
puchar putwchar Zapisuje bajt/ wchar_t na standardowe wyjście
stawia Nie dotyczy Zapisuje ciąg bajtów na standardowe wyjście
ungetc ungetwc Wstawia bajt/ wchar_t z powrotem do strumienia plików
Sformatowane
wejście/wyjście
scanf
fscanf
sscanf
wscanf
fwscanf
swscanf
Odczytuje sformatowane dane wejściowe byte/ wchar_t ze standardowego wejścia,
strumienia pliku lub bufora
vscanf
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
Odczytuje sformatowany bajt wejściowy/ wchar_t ze standardowego wejścia,
strumienia pliku lub bufora przy użyciu listy zmiennych argumentów
printf
fprintf
sprintf
snprintf
wprintf
fwprintf
swprintf
Wyświetla sformatowane wyjście byte/ wchar_t na standardowe wyjście,
strumień pliku lub bufor
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
Wyświetla sformatowany bajt/ wchar_t na standardowe wyjście,
strumień plików lub bufor używając zmiennej listy argumentów
błąd Nie dotyczy Zapisuje opis bieżącego błędu do stderr
Pozycjonowanie plików ftell
ftello
Zwraca wskaźnik aktualnej pozycji pliku
fseek
fseeko
Przenosi wskaźnik pozycji pliku do określonej lokalizacji w pliku
fgetpos Pobiera wskaźnik pozycji pliku
fsetpos Przenosi wskaźnik pozycji pliku do określonej lokalizacji w pliku
przewijanie do tyłu Przesuwa wskaźnik pozycji pliku na początek pliku

Obsługa błędów
jaśniej Usuwa błędy
feof Sprawdza koniec pliku
strach Sprawdza występowanie błędów pliku
Operacje
na plikach
usunąć Usuwa plik
Przemianować Zmienia nazwę pliku
tmpfile Zwraca wskaźnik do pliku tymczasowego
tmpnam Zwraca unikalną nazwę pliku

Stałe

Stałe zdefiniowane w nagłówku <stdio.h> obejmują:

Nazwa Uwagi
EOF Ujemna liczba całkowita typu int używana do wskazania warunków końca pliku
BUFSIZ Liczbą całkowitą, która ma wielkość bufora wykorzystywane przez () setbuf funkcji
FILENAME_MAX Rozmiar tablicy znaków, który jest wystarczająco duży, aby przechowywać nazwę dowolnego pliku, który można otworzyć
FOPEN_MAX Liczba plików, które mogą być otwarte jednocześnie; będzie co najmniej osiem
_IOFBF Skrót od „wejście/wyjście w pełni buforowane”; jest to liczba całkowita, która może być przekazana do funkcji setvbuf() w celu żądania wejścia i wyjścia buforowanego bloku dla otwartego strumienia
_IOLBF Skrót od „buforowanej linii wejścia/wyjścia”; jest to liczba całkowita, która może być przekazana do funkcji setvbuf() w celu zażądania wejścia i wyjścia buforowanego wiersza dla otwartego strumienia
_IONBF Skrót od „wejście/wyjście niebuforowane”; jest to liczba całkowita, którą można przekazać do funkcji setvbuf(), aby zażądać niebuforowanego wejścia i wyjścia dla otwartego strumienia
L_tmpnam Wielkość char tablicy, które jest wystarczające do przechowywania tymczasowego pliku, wynikającymi z dużej tmpnam () funkcja
ZERO Makro rozszerzające się do stałej wskaźnika pustego ; to jest stała reprezentująca wartość wskaźnika, który jest gwarantowany nie być prawidłowy adres obiektu w pamięci
SEEK_CUR Liczba całkowita, którą można przekazać do funkcji fseek(), aby zażądać pozycjonowania względem bieżącej pozycji pliku
SEEK_END Liczba całkowita, którą można przekazać do funkcji fseek() w celu zażądania pozycjonowania względem końca pliku
SEEK_SET Liczba całkowita, którą można przekazać do funkcji fseek() w celu zażądania pozycjonowania względem początku pliku
TMP_MAX Maksymalna liczba unikalnych nazw plików możliwych do wygenerowania przez funkcję tmpnam() ; będzie co najmniej 25

Zmienne

Stdstreams-notitle.svg

Zmienne zdefiniowane w nagłówku <stdio.h> obejmują:

Nazwa Uwagi
stdin Wskaźnik do PLIKU, który odnosi się do standardowego strumienia wejściowego, zwykle klawiatury.
stdout Wskaźnik do PLIKU, który odnosi się do standardowego strumienia wyjściowego, zwykle terminala wyświetlającego.
stderr Wskaźnik do PLIKU, który odnosi się do standardowego strumienia błędów, często terminala wyświetlającego.

Typy członków

Typy danych zdefiniowane w nagłówku <stdio.h> obejmują:

  • PLIK – znany również jakofile handle , jest to nieprzezroczysty typ zawierający informacje o pliku lub strumieniu tekstowym potrzebne do wykonania na nim operacji wejścia lub wyjścia, w tym:
    • specyficzny dla platformy identyfikator powiązanego urządzenia we/wy, taki jak deskryptor pliku
    • bufor
    • wskaźnik orientacji strumienia (nieustawiony, wąski lub szeroki)
    • wskaźnik stanu buforowania strumienia (niebuforowany, buforowany w linii, w pełni buforowany)
    • Wskaźnik trybu we/wy (strumień wejściowy, strumień wyjściowy lub strumień aktualizacji)
    • wskaźnik trybu binarnego/tekstowego
    • wskaźnik końca pliku
    • wskaźnik błędu
    • bieżąca pozycja strumienia i stan konwersji wielobajtowej (obiekt typu mbstate_t)
    • zamek wklęsły (wymagany od C11 )
  • fpos_t – typ bez tablicy zdolny do jednoznacznej identyfikacji pozycji każdego bajtu w pliku i każdego stanu konwersji, który może wystąpić we wszystkich obsługiwanych wielobajtowych kodowaniach znaków
  • size_t – typ liczby całkowitej bez znaku, który jest typem wyniku operatora sizeof .

Rozszerzenia

Standard POSIX definiuje kilka rozszerzeń stdio w swoich podstawowych definicjach, między innymi funkcję readline, która alokuje pamięć, funkcje fileno i fdopen, które ustanawiają połączenie między obiektami FILE a deskryptorami plików oraz grupę funkcji do tworzenia obiektów FILE, które odwołują się do do buforów w pamięci.

Przykład

Poniższy program w C otwiera plik binarny o nazwie myfile , odczytuje z niego pięć bajtów, a następnie zamyka plik.

#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;
}

Alternatywy dla stdio

Opracowano kilka alternatyw dla stdio . Wśród nich jest biblioteka iostream C++ , część standardu ISO C++ . ISO C++ nadal wymaga funkcjonalności stdio .

Inne alternatywy obejmują bibliotekę SFIO (A Safe/Fast I/O Library) firmy AT&T Bell Laboratories . Ta biblioteka, wprowadzona w 1991 roku, miała na celu uniknięcie niespójności, niebezpiecznych praktyk i nieefektywności w projektowaniu stdio . Wśród jego funkcji jest możliwość wstawiania funkcji zwrotnych do strumienia w celu dostosowania obsługi danych odczytywanych lub zapisywanych w strumieniu. Został wydany światu zewnętrznemu w 1997 roku, a ostatnie wydanie miało miejsce 1 lutego 2005 roku.

Zobacz też

Bibliografia

Zewnętrzne linki