C Files I/O: Vytvoření, otevření, čtení, zápis a uzavření souboru

⚡ Chytré shrnutí

Práce se soubory v jazyce C ukládá na disk pomocí knihovny stdio, která soubor otevírá příkazem fopen, zapisuje do něj pomocí fputc, fputs nebo fprintf, čte do něj pomocí fgetc, fgets nebo fscanf a zavírá ho pomocí fclose.

  • 📁 Režimy souborů: Řetězec režimu předaný funkci fopen – r, w, a, r+, w+ nebo a+ – určuje, zda bude soubor čtený, přepisovaný nebo přidávaný.
  • __ Zápis dat: Funkce fputc zapíše jeden znak, fputs zapíše řetězec a fprintf zapíše formátovaný text do ukazatele souboru.
  • 📖 Čtení dat: Funkce fgetc čte znak, fgets čte řádek do bufferu a fscanf analyzuje formátované tokeny ze souboru.
  • 🔒 Zavírání souborů: Funkce fclose vyprázdní data z bufferu a uvolní soubor, v případě úspěchu vrátí hodnotu 0 a v případě neúspěchu hodnotu EOF.
  • 🔁 Interaktivní I/O: Funkce getc a putc zpracovávají jeden znak po druhém, přesouvají vstup přímo do souboru a zpět.
  • 🤖 Asistence AI: GitHub Copilot a AI asistenti vytvářejí scaffold rutiny fopen, fprintf a fgets a označují chybějící kontroly NULL nebo neuzavřené soubory.

C Soubory I/O

C Správa souborů

Soubor lze použít k ukládání velkého objemu trvalých dat. Stejně jako mnoho jiných jazyků nabízí i „C“ následující správu souborů. funkce,

  1. Vytvoření souboru
  2. Otevření souboru
  3. Čtení souboru
  4. Zápis do souboru
  5. Zavření souboru

Níže jsou uvedeny nejdůležitější funkce správy souborů dostupné v 'C,'

funkce účel
fopen() Vytvoření souboru nebo otevření existujícího souboru
fclose () Zavření souboru
fprintf() Zápis bloku dat do souboru
fscanf () Čtení dat bloku ze souboru
getc () Přečte jeden znak ze souboru
putc () Zapíše jeden znak do souboru
getw () Přečte celé číslo ze souboru
putw () Zápis celého čísla do souboru
fhledat () Nastaví polohu ukazatele souboru na zadané umístění
ftell () Vrátí aktuální pozici ukazatele souboru
přetočit () Nastaví ukazatel souboru na začátek souboru

Jak vytvořit soubor

Kdykoli chcete pracovat se souborem, prvním krokem je vytvoření souboru. Soubor není nic jiného než prostor v paměti, kde jsou uložena data.

K vytvoření souboru v programu 'C' se používá následující syntaxe,

FILE *fp;
fp = fopen ("file_name", "mode");

Ve výše uvedené syntaxi je soubor datovou strukturou, která je definována ve standardní knihovně.

fopen je standardní funkce, která se používá k otevření souboru.

  • Pokud soubor není v systému přítomen, je vytvořen a poté otevřen.
  • Pokud je soubor již v systému přítomen, pak se pomocí této funkce přímo otevře.

fp je soubor ukazatel který ukazuje na typový soubor.

Kdykoli otevřete nebo vytvoříte soubor, musíte určit, co se souborem uděláte. Soubor v programování 'C' lze vytvořit nebo otevřít pro účely čtení/zápisu. Režim se používá k určení, zda chcete otevřít soubor pro některý z níže uvedených účelů. Následují různé typy režimů v programování 'C', které lze použít při práci se souborem.

Režim souborů Description
r Otevřete soubor ke čtení. Pokud je soubor v režimu čtení, nebudou odstraněna žádná data, pokud je soubor již v systému přítomen.
w Otevřete soubor pro zápis. Pokud je soubor v režimu zápisu, vytvoří se nový soubor, pokud soubor vůbec neexistuje. Pokud je soubor již v systému přítomen, všechna data v souboru jsou zkrácena a je otevřen pro účely zápisu.
a Otevření souboru v režimu přidávání. Pokud je soubor v režimu přidávání, soubor se otevře. Obsah souboru se nemění.
r+ otevřená pro čtení a psaní od začátku
w+ otevřít pro čtení a zápis, přepsání souboru
a+ otevřít pro čtení a zápis, připojení k souboru

V dané syntaxi jsou název souboru a režim specifikovány jako řetězce proto musí být vždy uzavřeny v uvozovkách.

Například:

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("data.txt", "w");
}

Výstup:

Soubor se vytvoří ve stejné složce, kam jste uložili svůj kód.

Vytvoření souboru ve výstupu programu v jazyce C

Můžete zadat cestu, kde chcete soubor vytvořit

#include <stdio.h>
int main() {
FILE *fp;
fp  = fopen ("D://data.txt", "w");
}

Vytvořte soubor se zadanou cestou v jazyce C

Jak zavřít soubor

Člověk by měl vždy zavřít soubor, kdykoli operace se souborem skončí. To znamená, že obsah a odkazy na soubor jsou ukončeny. Tím se zabrání náhodnému poškození souboru.

'C' poskytuje funkci fclose pro provedení operace uzavření souboru. Syntaxe fclose je následující,

fclose (file_pointer);

Například:

FILE *fp;
fp  = fopen ("data.txt", "r");
fclose (fp);

Funkce fclose přijímá jako argument ukazatel souboru. Soubor spojený s ukazatelem souboru je poté pomocí funkce fclose uzavřen. V případě úspěšného zavření vrátí hodnotu 0 a v případě chyby při zavírání souboru vrátí hodnotu EOF (konec souboru).

Po zavření souboru lze stejný ukazatel souboru použít také s jinými soubory.

V programování 'C' se soubory automaticky zavřou, když je program ukončen. Ruční uzavření souboru zápisem funkce fclose je dobrou programátorskou praxí.

Zápis do souboru

V C, když zapisujete do souboru, musí být explicitně přidány znaky nového řádku '\n'.

Knihovna stdio nabízí potřebné funkce pro zápis do souboru:

  • fputc(char, file_pointer): Zapíše znak do souboru, na který odkazuje file_pointer.
  • fputs(str, file_pointer): Zapíše řetězec do souboru, na který odkazuje file_pointer.
  • fprintf(ukazatel_souboru, str, seznam_proměnných): Vypíše řetězec do souboru, na který odkazuje ukazatel_souboru. Řetězec může volitelně obsahovat specifikátory formátu a seznam proměnných seznam_proměnných.

Níže uvedený program ukazuje, jak provést zápis do souboru:

Funkce fputc():

#include <stdio.h>
int main() {
        int i;
        FILE * fptr;
        char fn[50];
        char str[] = "Guru99 Rocks\n";
        fptr = fopen("fputc_test.txt", "w"); // "w" defines "writing mode"
        for (i = 0; str[i] != '\n'; i++) {
            /* write to file using fputc() function */
            fputc(str[i], fptr);
        }
        fclose(fptr);
        return 0;
    }

Výstup:

Výstup funkce fputc() v jazyce C

Výše uvedený program zapisuje do souboru fputc_test.txt jeden znak, dokud nedosáhne symbolu dalšího řádku „\n“, který indikuje, že věta byla úspěšně zapsána. Proces spočívá ve zapsání každého znaku z pole do souboru.

Obsah souboru fputc_test.txt napsaný v jazyce C

  1. Ve výše uvedeném programu jsme vytvořili a otevřeli soubor s názvem fputc_test.txt v režimu zápisu a deklarovali náš řetězec, který bude zapsán do souboru.
  2. Provedeme operaci zápisu znak po znaku pomocí cyklu for a vložíme každý znak do našeho souboru, dokud nenarazíme na znak „\n“, pak se soubor zavře pomocí funkce fclose.

fputs () Funkce:

#include <stdio.h>
int main() {
        FILE * fp;
        fp = fopen("fputs_test.txt", "w+");
        fputs("This is Guru99 Tutorial on fputs,", fp);
        fputs("We don't need to use for loop\n", fp);
        fputs("Easier than fputc function\n", fp);
        fclose(fp);
        return (0);
    }

Výstup:

Výstup funkce fputs() v jazyce C

Obsah souboru fputs_test.txt v jazyce C

  1. Ve výše uvedeném programu jsme vytvořili a otevřeli soubor s názvem fputs_test.txt v režimu zápisu.
  2. Poté, co provedeme operaci zápisu pomocí funkce fputs() zapsáním tří různých řetězců
  3. Poté je soubor uzavřen pomocí funkce fclose.

fprintf()Funkce:

#include <stdio.h>
    int main() {
        FILE *fptr;
        fptr = fopen("fprintf_test.txt", "w"); // "w" defines "writing mode"
        /* write to file */
        fprintf(fptr, "Learning C with Guru99\n");
        fclose(fptr);
        return 0;
    }

Výstup:

Výstup funkce fprintf() v jazyce C

Obsah souboru fprintf_test.txt v jazyce C

  1. Ve výše uvedeném programu jsme vytvořili a otevřeli soubor s názvem fprintf_test.txt v režimu zápisu.
  2. Po provedení operace zápisu pomocí funkce fprintf() zapsáním řetězce se soubor uzavře pomocí funkce fclose.

Čtení dat ze souboru

Ke čtení dat ze souboru jsou určeny tři různé funkce

  • fgetc(ukazatel_souboru): Vrací další znak ze souboru, na který odkazuje ukazatel souboru. Po dosažení konce souboru je zpět odeslán EOF.
  • fgets(buffer, n, file_pointer): Přečte n-1 znaků ze souboru a uloží řetězec do bufferu, ve kterém je jako poslední znak připojen znak NULL '\0'.
  • fscanf(ukazatel_souboru, specifikace_převodu, adresy_proměnných): Používá se k parsování a analýze dat. Čte znaky ze souboru a přiřazuje vstup seznamu ukazatelů na proměnné adresy_proměnných pomocí specifikátorů převodu. Mějte na paměti, že stejně jako u scanf, i fscanf zastaví čtení řetězce, když narazí na mezeru nebo znak nového řádku.

Následující program demonstruje čtení ze souboru fputs_test.txt pomocí funkcí fgets(), fscanf() a fgetc ():

#include <stdio.h>
int main() {
        FILE * file_pointer;
        char buffer[30], c;

        file_pointer = fopen("fprintf_test.txt", "r");
        printf("----read a line----\n");
        fgets(buffer, 50, file_pointer);
        printf("%s\n", buffer);

        printf("----read and parse data----\n");
        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        char str1[10], str2[2], str3[20], str4[2];
        fscanf(file_pointer, "%s %s %s %s", str1, str2, str3, str4);
        printf("Read String1 |%s|\n", str1);
        printf("Read String2 |%s|\n", str2);
        printf("Read String3 |%s|\n", str3);
        printf("Read String4 |%s|\n", str4);

        printf("----read the entire file----\n");

        file_pointer = fopen("fprintf_test.txt", "r"); //reset the pointer
        while ((c = getc(file_pointer)) != EOF) printf("%c", c);

        fclose(file_pointer);
        return 0;
    }

Výsledek:

----read a line----
Learning C with Guru99

----read and parse data----
Read String1 |Learning|
Read String2 |C|
Read String3 |with|
Read String4 |Guru99|
----read the entire file----
Learning C with Guru99

Čtení dat ze souboru ve výstupu v jazyce C

  1. Ve výše uvedeném programu jsme otevřeli soubor s názvem „fprintf_test.txt“, který byl dříve napsán pomocí funkce fprintf() a obsahuje text „Učení se C s…“. GuruŘetězec o délce 99 palců. Čteme ho pomocí funkce fgets(), která čte řádek po řádku, přičemž velikost vyrovnávací paměti musí být dostatečná pro zpracování celého řádku.
  2. Soubor znovu otevřeme, abychom resetovali ukazatel souboru na začátek souboru. Vytvoříme různé řetězcové proměnné pro zpracování každého slova zvlášť. Vypíšeme proměnné a zobrazíme jejich obsah. Funkce fscanf() se používá hlavně k explozi.tract a analyzovat data ze souboru.
  3. Znovu otevřete soubor, abyste obnovili soubor ukazatele tak, aby ukazoval na začátek souboru. Čtěte data a tiskněte je ze souboru znak po znaku pomocí funkce getc(), dokud nenarazíte na příkaz EOF
  4. Po provedení operace čtení souboru pomocí různých variant jsme soubor opět zavřeli pomocí funkce fclose.

Interaktivní čtení a zápis souborů pomocí getc a putc

Toto jsou nejjednodušší operace se soubory. Getc znamená získat charakter a putc znamená put charakter. Tyto dvě funkce se používají ke zpracování pouze jednoho znaku najednou.

Následující program demonstruje funkce zpracování souborů v programování 'C':

#include <stdio.h>
int main() {
        FILE * fp;
        char c;
        printf("File Handling\n");
        //open a file
        fp = fopen("demo.txt", "w");
        //writing operation
        while ((c = getchar()) != EOF) {
            putc(c, fp);
        }
        //close file
        fclose(fp);
        printf("Data Entered:\n");
        //reading
        fp = fopen("demo.txt", "r");
        while ((c = getc(fp)) != EOF) {
            printf("%c", c);
        }
        fclose(fp);
        return 0;
    }

Výstup:

Interaktivní čtení a zápis souborů ve výstupu C

Zpracování výstupu souborů getc a putc v jazyce C

  1. Ve výše uvedeném programu jsme vytvořili a otevřeli soubor s názvem demo v režimu zápisu.
  2. Po provedení operace zápisu se soubor zavře pomocí funkce fclose.
  3. Znovu jsme otevřeli soubor, který nyní obsahuje data v režimu čtení. Smyčka while bude probíhat, dokud nebude nalezen eof. Jakmile je nalezen konec souboru, operace se ukončí a data se zobrazí pomocí funkce printf.
  4. Po provedení operace čtení se soubor opět zavře pomocí funkce fclose.

Nejčastější dotazy

Textový režim překládá znaky nového řádku tak, aby odpovídaly operačnímu systému, zatímco binární režim, otevřený pomocí „rb“ nebo „wb“, zapisuje bajty přesně tak, jak jsou. Binární režim použijte pro obrázky, zvuk nebo jakákoli data, u kterých je nutné zachovat přesné rozložení bajtů.

Funkce fopen vrací hodnotu NULL, pokud soubor nelze otevřít, například pokud je soubor chybějící, je mu odepřeno oprávnění nebo je disk plný. Před čtením nebo zápisem vždy otestujte vrácený ukazatel na hodnotu NULL, jinak program použije neplatný ukazatel a obvykle dojde k jeho pádu.

Režim zápisu „w“ zkrátí existující soubor, vymaže jeho obsah před zápisem a vytvoří soubor, když soubor chybí. Režim přidávání „a“ zachovává existující data a na konec přidává nový obsah, takže se nic, co je již uloženo, neztratí.

Funkce fseek přesune ukazatel souboru na offset o jeden bajt měřený od SEEK_SET, SEEK_CUR nebo SEEK_END. Funkce ftell vrátí aktuální pozici ukazatele v bajtu a funkce rewind ji pošle zpět na začátek souboru. Společně umožňují náhodný přístup místo sekvenčního čtení.

fgets přečte celý řádek, stopping na novém řádku nebo po n-1 znaku, takže respektuje velikost vyrovnávací paměti. fscanf čte formátované, mezerami oddělené tokeny a může přeplnit pole short. Pro bezpečné čtení celých řádků je lepší volbou fgets.

EOF je konstanta, obvykle -1, která označuje konec souboru. Funkce pro čtení, jako například getc, fgetc a fscanf, vracejí EOF, jakmile nezbývají žádná další data, a proto smyčky porovnávají svůj výsledek s EOF, aby zastavily čtení.

Ano. Asistent programování s umělou inteligencí dokáže generovat rutiny fopen, fprintf a fgets z příkazového řádku v otevřeném jazyce, vysvětlit každý režim souboru a odhalit chyby, jako je chybějící kontrola NULL nebo neuzavřený soubor. Vždy zkompilujte a otestujte kód navržený umělou inteligencí, než mu budete důvěřovat.

GitHub Copilot píše kód pro práci se soubory v jazyce C, který navrhuje kompletní bloky fopen, fputs a fscanf z krátkého komentáře nebo názvu funkce. Často přidává odpovídající volání funkce fclose a kontrolu chyb, i když byste si měli stále prohlédnout vygenerovanou logiku.

Shrňte tento příspěvek takto: