Vstup/výstup souboru C - C file input/output
Standardní knihovna C. |
---|
Obecná témata |
Různé záhlaví |
C programovací jazyk poskytuje mnoho standardních knihovních funkcí pro souborový vstup a výstup . Tyto funkce tvoří hlavní část záhlaví standardní knihovny C <stdio.h> . Funkce pochází z „přenosného I/O balíčku“, který napsal Mike Lesk v Bell Labs na začátku 70. let a oficiálně se stal součástí operačního systému Unix ve verzi 7 .
I/O funkčnost C je podle moderních standardů poměrně nízká; C abstrahuje všechny operace se soubory do operací na tocích v bytech , které mohou být „vstupní proudy“ nebo „výstupní proudy“. Na rozdíl od některých dřívějších programovacích jazyků nemá C přímou podporu pro datové soubory s náhodným přístupem ; Chcete -li číst ze záznamu uprostřed souboru, musí programátor vytvořit proud, hledat doprostřed souboru a poté ze streamu postupně číst bajty.
Streamový model souborových I/O byl propagován Unixem, který byl vyvinut souběžně se samotným programovacím jazykem C. Drtivá většina moderních operačních systémů zdědila toky z Unixu a mnoho jazyků z rodiny programovacích jazyků C zdědilo C souborové I/O rozhraní s malými, pokud vůbec nějakými změnami (například PHP ).
Přehled
Tato knihovna používá takzvané streamy k práci s fyzickými zařízeními, jako jsou klávesnice, tiskárny, terminály nebo s jakýmkoli jiným typem souborů podporovaných systémem. Streamy jsou abstrakcí, která s nimi jednotně spolupracuje. Všechny toky mají podobné vlastnosti nezávislé na individuálních charakteristikách fyzického média, se kterým jsou spojeny.
Funkce
Většina vstupních/výstupních funkcí souboru C je definována v <stdio.h> (nebo v hlavičce C ++ cstdio , která obsahuje standardní funkce C, ale v oboru názvů std ).
Bajtový charakter |
Široký charakter |
Popis | |
---|---|---|---|
Přístup k souboru | otevřít | Otevře soubor (s názvem souboru, který není Unicode v systému Windows a možným názvem souboru UTF-8 v systému Linux) | |
otevřít | Otevře jiný soubor s existujícím streamem | ||
fflush | Synchronizuje výstupní proud se skutečným souborem | ||
fclose | Zavře soubor | ||
setbuf | Nastaví vyrovnávací paměť pro datový proud souboru | ||
setvbuf | Nastaví vyrovnávací paměť a její velikost pro datový proud souboru | ||
celostátní | Přepíná tok souborů mezi širokopásmovými I/O a úzkými znaky I/O | ||
Přímý vstup/výstup |
fread | Čte ze souboru | |
fwrite | Zapisuje do souboru | ||
Neformátovaný vstup/výstup |
fgetc getc |
fgetwc getwc |
Přečte bajt/ wchar_t ze streamu souboru |
fgets | fgetws | Přečte řádek byte/ wchar_t ze streamu souboru | |
fputc putc |
fputwc putwc |
Zapíše bajt/ wchar_t do datového proudu souboru | |
fputs | fputws | Zapíše řetězec byte/ wchar_t do datového proudu souboru | |
dostat | getwchar | Přečte byte/ wchar_t ze stdin | |
|
N/A | Přečte bajtový řetězec ze stdin, dokud nenastane nový řádek nebo konec souboru (zastaralé v C99, odebráno z C11) | |
putchar | putwchar | Zapisuje byte/ wchar_t na standardní výstup | |
klade | N/A | Zapíše bajtový řetězec na standardní výstup | |
ungetc | ungetwc | Vloží byte/ wchar_t zpět do proudu souborů | |
Formátovaný vstup/výstup |
scanf fscanf sscanf |
wscanf fwscanf swscanf |
Čte vstup ve formátu byte/ wchar_t ze stdin, proudu souboru nebo vyrovnávací paměti |
vscanf vfscanf vsscanf |
vwscanf vfwscanf vswscanf |
Čte formátovaný vstupní bajt/ wchar_t ze stdin, proudu souboru nebo vyrovnávací paměti pomocí seznamu proměnných argumentů |
|
printf fprintf sprintf snprintf |
wprintf fwprintf swprintf |
Vytiskne formátovaný výstup byte/ wchar_t na standardní výstup, datový proud souboru nebo vyrovnávací paměť |
|
vprintf vfprintf vsprintf vsnprintf |
vwprintf vfwprintf vswprintf |
Vytiskne formátovaný výstup byte/ wchar_t na standardní výstup, tok souboru nebo vyrovnávací paměť pomocí seznamu proměnných argumentů |
|
perror | N/A | Zapíše popis aktuální chyby do stderr | |
Umístění souboru |
ftell ftello |
Vrátí indikátor aktuální polohy souboru | |
fseek fseeko |
Přesune indikátor polohy souboru na konkrétní místo v souboru | ||
fgetpos | Získá indikátor polohy souboru | ||
fsetpos | Přesune indikátor polohy souboru na konkrétní místo v souboru | ||
přetočit | Přesune indikátor polohy souboru na začátek v souboru | ||
Zpracování chyb |
jasnější | Vymaže chyby | |
feof | Kontroluje konec souboru | ||
ferror | Kontroluje chybu souboru | ||
Operace se soubory |
odstranit | Vymaže soubor | |
přejmenovat | Přejmenuje soubor | ||
tmpfile | Vrátí ukazatel na dočasný soubor | ||
tmpnam | Vrátí jedinečný název souboru |
Konstanty
Konstanty definované v záhlaví <stdio.h> zahrnují:
název | Poznámky |
---|---|
EOF | Záporné celé číslo typu int používané k označení podmínek konce souboru |
BUFSIZ | Celé číslo, které je velikost vyrovnávací paměti používá setbuf () funkci |
FILENAME_MAX | Velikost pole char, které je dostatečně velké na uložení názvu libovolného souboru, který lze otevřít |
FOPEN_MAX | Počet souborů, které mohou být otevřeny současně; bude nejméně osm |
_IOFBF | Zkratka pro „vstup/výstup plně vyrovnávací paměť“; je to celé číslo, které může být předáno funkci setvbuf () k vyžádání vstupu a výstupu blokovaného do vyrovnávací paměti pro otevřený proud |
_IOLBF | Zkratka pro „vstupní/výstupní řádek s vyrovnávací pamětí“; je to celé číslo, které může být předáno funkci setvbuf () k vyžádání vstupu a výstupu s vyrovnávací pamětí pro otevřený proud |
_IONBF | Zkratka pro „vstup/výstup není uložen do vyrovnávací paměti“; je to celé číslo, které může být předáno funkci setvbuf () k vyžádání vstupu a výstupu bez vyrovnávací paměti pro otevřený proud |
L_tmpnam | Velikost char pole, což je dost pro uložení dočasné jméno souboru generované velké tmpnam () funkce |
NULA | Makro rozšiřující se na konstantu nulového ukazatele ; tj. konstanta představující hodnotu ukazatele, která zaručeně není platnou adresou objektu v paměti |
SEEK_CUR | Celé číslo, které může být předáno funkci fseek () k vyžádání umístění vzhledem k aktuální poloze souboru |
SEEK_END | Celé číslo, které může být předáno funkci fseek () k vyžádání umístění vzhledem ke konci souboru |
SEEK_SET | Celé číslo, které může být předáno funkci fseek () k vyžádání umístění vzhledem k začátku souboru |
TMP_MAX | Maximální počet jedinečných názvů souborů generovatelných funkcí tmpnam () ; bude minimálně 25 |
Proměnné
Proměnné definované v záhlaví <stdio.h> zahrnují:
název | Poznámky |
---|---|
stdin | Ukazatel na FILE, který odkazuje na standardní vstupní proud, obvykle klávesnici. |
standardní výstup | Ukazatel na FILE, který odkazuje na standardní výstupní proud, obvykle zobrazovací terminál. |
stderr | Ukazatel na FILE, který odkazuje na standardní chybový proud, často terminál displeje. |
Typy členů
Mezi datové typy definované v záhlaví <stdio.h> patří:
-
FILE - také známý jakopopisovač souboru , jedná se o neprůhledný typ obsahující informace o souboru nebo textovém proudu potřebném k provádění vstupních nebo výstupních operací, včetně:
- platform-specific identifier of associated I/O device, such as a file descriptor
- vyrovnávací paměť
- indikátor orientace proudu (nenastavený, úzký nebo široký)
- indikátor stavu vyrovnávací paměti proudu (bez vyrovnávací paměti, vyrovnávací paměť řádků, plně vyrovnávací paměť)
- Indikátor režimu I/O (vstupní stream, výstupní stream nebo aktualizační stream)
- indikátor binárního/textového režimu
- indikátor konce souboru
- chybový indikátor
- aktuální poloha streamu a stav převodu více bajtů (objekt typu mbstate_t)
- reentrantní zámek (vyžadováno od C11 )
- fpos_t -typ bez pole schopný jednoznačně identifikovat pozici každého bajtu v souboru a každý stav převodu, ke kterému může dojít ve všech podporovaných vícebajtových kódováních znaků
- size_t - celočíselný typ bez znaménka, který je typem výsledku operátoru sizeof .
Rozšíření
Standard POSIX ve svých základních definicích definuje několik rozšíření pro stdio , mezi něž patří funkce readline, která přiděluje paměť, funkce fileno a fdopen, které vytvářejí propojení mezi objekty FILE a deskriptory souborů , a skupina funkcí pro vytváření objektů FILE, které odkazují na do vyrovnávací paměti v paměti.
Příklad
Následující program C otevře binární soubor s názvem myfile , přečte z něj pět bajtů a poté soubor zavře.
#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;
}
Alternativy k stdio
Bylo vyvinuto několik alternativ k stdio . Mezi nimi je knihovna C ++ iostream , součást standardu ISO C ++ . ISO C ++ stále vyžaduje funkci stdio .
Mezi další alternativy patří knihovna SFIO (A Safe/Fast I/O Library) od AT&T Bell Laboratories . Tato knihovna, který byl zaveden v roce 1991, jehož cílem je, aby se zabránilo rozporům, nebezpečné postupy a neúčinnost v designu stdio . Mezi jeho funkce patří možnost vkládat zpětné funkce zpětného volání do proudu, aby bylo možné přizpůsobit zpracování dat čtených z nebo zapisovaných do streamu. To bylo propuštěno do vnějšího světa v roce 1997 a poslední vydání bylo 1. února 2005.
Viz také
Reference
externí odkazy
- Média související se vstupem/výstupem souboru C na Wikimedia Commons