Vstup/výstup souboru C - C file input/output

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
dostane 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é

Stdstreams-notitle.svg

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