Wejście/wyjście pliku C - C file input/output
Biblioteka standardowa C |
---|
Tematy ogólne |
Różne nagłówki |
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 | |
|
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
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
- Multimedia związane z wejściem/wyjściem pliku C w Wikimedia Commons