Odevzdání souboru C je proces, ve kterém vytváříme, otevíráme, čteme, zapisujeme a zavíráme operace se souborem. Jazyk C poskytuje různé funkce jako fopen(), fwrite(), fread(), fseek(), fprintf() atd. pro provádění vstupu, výstupu a mnoha různých operací se soubory C v našem programu.
Proč potřebujeme zpracování souborů v C?
Dosud se operace pomocí programu C provádějí na příkazovém řádku/terminálu, který není nikde uložen. Výstup se vymaže při zavření programu. Ale v softwarovém průmyslu je většina programů napsána tak, aby ukládala informace získané z programu. Využití zpracování souborů je přesně to, co situace vyžaduje.
Abychom pochopili, proč je zpracování souborů důležité, podívejme se na několik funkcí používání souborů:
- Opětovná použitelnost: K datům uloženým v souboru lze přistupovat, aktualizovat a mazat kdekoli a kdykoli, což poskytuje vysokou znovupoužitelnost.
- Přenosnost: Bez ztráty dat lze soubory přenést do jiného v počítačovém systému. Riziko chybného kódování je touto funkcí minimalizováno.
- Účinný: Některé programy mohou vyžadovat velké množství vstupu. Manipulace se soubory vám umožňuje snadný přístup k části souboru pomocí několika pokynů, což šetří spoustu času a snižuje pravděpodobnost chyb.
- Kapacita skladu: Soubory vám umožňují ukládat velké množství dat, aniž byste se museli starat o ukládání všeho současně v programu.
Typy souborů v C
Soubor lze rozdělit do dvou typů podle způsobu, jakým soubor ukládá data. Jsou následující:
- Textové soubory
- Binární soubory
1. Textové soubory
Textový soubor obsahuje data v ve formě ASCII znaků a obecně se používá k ukládání proudu znaků.
- Každý řádek v textovém souboru končí znakem nového řádku („ “).
- Lze jej číst nebo zapisovat libovolným textovým editorem.
- Obvykle jsou uloženy s .txt přípona souboru.
- K uložení zdrojového kódu lze také použít textové soubory.
2. Binární soubory
Binární soubor obsahuje data v binární tvar (tj. 0 a 1) místo znaků ASCII. Obsahují data, která jsou uložena podobným způsobem, jakým jsou uložena v hlavní paměti.
- Binární soubory mohou být vytvořeny pouze z programu a jejich obsah může být čten pouze programem.
- Bezpečnější, protože nejsou snadno čitelné.
- Obvykle jsou uloženy s .zásobník přípona souboru.
Operace se soubory C
Operace se soubory C odkazují na různé možné operace, které můžeme provádět se souborem v C, jako například:
- Vytvoření nového souboru - fopen() s atributy jako a nebo a+ nebo w nebo w+
- Otevření existujícího souboru – fopen()
- Čtení ze souboru - fscanf() nebo fgets()
- Zápis do souboru - fprintf() nebo fputs()
- Přesunutí na určité místo v souboru – fseek() , přetočit()
- Zavření souboru - fclose()
Zvýrazněný text zmiňuje funkci C používanou k provádění operací se soubory.
Funkce pro operace se soubory C

Ukazatel souboru v C
Ukazatel souboru je odkaz na konkrétní pozici v otevřeném souboru. Používá se při manipulaci se soubory k provádění všech operací se soubory, jako je čtení, zápis, zavření atd. Používáme SOUBOR makro pro deklaraci proměnné ukazatele souboru. Uvnitř je definováno makro FILE hlavičkový soubor.
Syntaxe souborového ukazatele
FILE* pointer_name ;>
Ukazatel souboru se používá téměř ve všech operacích se soubory v C.
Otevřete soubor v C
Pro otevření souboru v C, fopen() Funkce se používá s názvem souboru nebo cestou k souboru spolu s požadovanými režimy přístupu.
Syntaxe fopen()
FILE* fopen (const char * file_name , const char * access_mode );>
Parametry
- název souboru : název souboru, pokud je ve stejném adresáři jako zdrojový soubor. Jinak plná cesta.
- access_mode: Určuje, pro jakou operaci se soubor otevírá.
Návratová hodnota
- Pokud je soubor úspěšně otevřen, vrátí na něj ukazatel souboru.
- Pokud se soubor neotevře, vrátí hodnotu NULL.
Režimy otevírání souborů v C
Režimy otevírání souborů nebo režimy přístupu určují povolené operace se souborem, který se má otevřít. Jsou předány jako argument funkci fopen(). Některé z běžně používaných režimů přístupu k souborům jsou uvedeny níže:
| Režimy otevírání | Popis |
|---|---|
| r | Vyhledá soubor. Pokud je soubor úspěšně otevřen, fopen() jej načte do paměti a nastaví ukazatel, který ukazuje na první znak v něm. Pokud soubor nelze otevřít, fopen() vrátí NULL. |
| rb | Otevřít pro čtení v binárním režimu. Pokud soubor neexistuje, fopen() vrátí NULL. |
| v | Otevřít pro psaní v textovém režimu. Pokud soubor existuje, jeho obsah se přepíše. Pokud soubor neexistuje, vytvoří se nový soubor. Pokud nelze soubor otevřít, vrátí hodnotu NULL. |
| wb | Otevřít pro zápis v binárním režimu. Pokud soubor existuje, jeho obsah se přepíše. Pokud soubor neexistuje, bude vytvořen. |
| A | Vyhledá soubor. Pokud je soubor úspěšně otevřen, fopen() jej načte do paměti a nastaví ukazatel, který ukazuje na poslední znak v něm. Otevře se pouze v režimu připojení. Pokud soubor neexistuje, vytvoří se nový soubor. Pokud nelze soubor otevřít, vrátí hodnotu NULL. |
| ab | Otevřete pro připojení v binárním režimu. Data jsou přidána na konec souboru. Pokud soubor neexistuje, bude vytvořen. |
| r+ | Vyhledá soubor. Je úspěšně otevřen fopen() načte jej do paměti a nastaví ukazatel, který ukazuje na první znak v něm. Pokud nelze soubor otevřít, vrátí hodnotu NULL. |
| rb+ | Otevřít pro čtení i zápis v binárním režimu. Pokud soubor neexistuje, fopen() vrátí NULL. |
| w+ | Vyhledá soubor. Pokud soubor existuje, jeho obsah se přepíše. Pokud soubor neexistuje, vytvoří se nový soubor. Pokud nelze soubor otevřít, vrátí hodnotu NULL. |
| wb+ | Otevřít pro čtení i zápis v binárním režimu. Pokud soubor existuje, jeho obsah se přepíše. Pokud soubor neexistuje, bude vytvořen. |
| a+ | Vyhledá soubor. Pokud je soubor úspěšně otevřen, fopen() jej načte do paměti a nastaví ukazatel, který ukazuje na poslední znak v něm. Otevře soubor v režimu čtení i připojení. Pokud soubor neexistuje, vytvoří se nový soubor. Pokud nelze soubor otevřít, vrátí hodnotu NULL. |
| ab+ | Otevřít pro čtení i přidávání v binárním režimu. Pokud soubor neexistuje, bude vytvořen. |
Jak je uvedeno výše, pokud chcete provádět operace s binárním souborem, musíte nakonec připojit „b“. Například místo w musíte použít wb, místo a+ musíte použít a+b.
Příklad otevření souboru
C
// C Program to illustrate file opening> #include> #include> int> main()> {> >// file pointer variable to store the value returned by> >// fopen> >FILE>* fptr;> >// opening the file in read mode> >fptr =>fopen>(>'filename.txt'>,>'r'>);> >// checking if the file is opened successfully> >if> (fptr == NULL) {> >printf>(>'The file is not opened. The program will '> >'now exit.'>);> >exit>(0);> >}> >return> 0;> }> |
>
>Výstup
The file is not opened. The program will now exit.>
Soubor se neotevře, protože ve zdrojovém adresáři neexistuje. Ale funkce fopen() je také schopna vytvořit soubor, pokud neexistuje. Je zobrazen níže
Vytvořte soubor v C
Funkce fopen() může nejen otevřít soubor, ale může také vytvořit soubor, pokud ještě neexistuje. K tomu musíme použít režimy, které umožňují vytvoření souboru, pokud není nalezen, jako například w, w+, wb, wb+, a, a+, ab a ab+.
FILE *fptr; fptr = fopen (' filename.txt ', ' w ');> Příklad otevření souboru
C
// C Program to create a file> #include> #include> int> main()> {> >// file pointer> >FILE>* fptr;> >// creating file using fopen() access mode 'w'> >fptr =>fopen>(>'file.txt'>,>'w'>);> >// checking if the file is created> >if> (fptr == NULL) {> >printf>(>'The file is not opened. The program will '> >'exit now'>);> >exit>(0);> >}> >else> {> >printf>(>'The file is created Successfully.'>);> >}> > >return> 0;> }> |
>
>Výstup
The file is created Successfully.>
Čtení ze souboru
Operaci čtení souboru v C lze provést pomocí funkcí fscanf() nebo fgets(). Obě funkce prováděly stejné operace jako funkce scanf a get, ale s dalším parametrem, ukazatelem souboru. Existují také další funkce, které můžeme použít ke čtení ze souboru. Tyto funkce jsou uvedeny níže:
| Funkce | Popis |
|---|---|
| fscanf() | Použijte formátovaný řetězec a seznam argumentů proměnných k převzetí vstupu ze souboru. |
| fgets() | Vložte celý řádek ze souboru. |
| fgetc() | Přečte jeden znak ze souboru. |
| dostat() | Přečte číslo ze souboru. |
| fread() | Přečte zadané bajty dat z binárního souboru. |
Záleží tedy na vás, zda chcete soubor číst řádek po řádku nebo znak po znaku.
Příklad:
FILE * fptr; fptr = fopen(fileName.txt, r); fscanf(fptr, '%s %s %s %d', str1, str2, str3, &year); char c = fgetc(fptr);>
Funkce getc() a některé další funkce pro čtení souborů vrátí EOF (End Of File), když při čtení dosáhnou konce souboru. EOF označuje konec souboru a jeho hodnota je definována implementací.
Poznámka: Jedna věc, kterou je třeba poznamenat, je, že po přečtení určité části souboru se ukazatel souboru automaticky přesune na konec posledního přečteného znaku.
Zapsat do souboru
Operace zápisu do souboru lze provádět pomocí funkcí fprintf() a fputs() s podobností s operacemi čtení. Programování C také poskytuje některé další funkce, které lze použít k zápisu dat do souboru, jako jsou:
| Funkce | Popis |
|---|---|
| fprintf() | Podobně jako printf() tato funkce používá k tisku výstupu do souboru formátovaný řetězec a seznam argumentů proměnných. |
| fputs() | Vytiskne celý řádek v souboru a nový řádek na konci. |
| fputc() | Vytiskne jeden znak do souboru. |
| fputw() | Vytiskne číslo do souboru. |
| fwrite() | Tato funkce zapíše zadané množství bajtů do binárního souboru. |
Příklad:
FILE *fptr ; fptr = fopen(fileName.txt, w); fprintf(fptr, '%s %s %s %d', 'We', 'are', 'in', 2012); fputc('a', fptr);> Zavření souboru
K uzavření souboru se používá funkce fclose(). Po úspěšných operacích se soubory musíte vždy soubor zavřít, abyste jej odstranili z paměti.
Syntaxe fclose()
fclose ( file_pointer );>
Kde file_pointer je ukazatel na otevřený soubor.
Příklad:
FILE *fptr ; fptr= fopen(fileName.txt, w); ---------- Some file Operations ------- fclose(fptr);>
Příklady předávání souborů v C
Příklad 1: Program pro vytvoření souboru, zápis do něj a uzavření souboru
C
// C program to Open a File,> // Write in it, And Close the File> #include> #include> int> main()> {> >// Declare the file pointer> >FILE>* filePointer;> >// Get the data to be written in file> >char> dataToBeWritten[50] =>'techcodeview.com-A Computer '> >'Science Portal for Geeks'>;> >// Open the existing file GfgTest.c using fopen()> >// in write mode using 'w' attribute> >filePointer =>fopen>(>'GfgTest.c'>,>'w'>);> >// Check if this filePointer is null> >// which maybe if the file does not exist> >if> (filePointer == NULL) {> >printf>(>'GfgTest.c file failed to open.'>);> >}> >else> {> >printf>(>'The file is now opened.
'>);> >// Write the dataToBeWritten into the file> >if> (>strlen>(dataToBeWritten)>0) {> >// writing in the file using fputs()> >fputs>(dataToBeWritten, filePointer);> >fputs>(>'
'>, filePointer);> >}> >// Closing the file using fclose()> >fclose>(filePointer);> >printf>(>'Data successfully written in file '> >'GfgTest.c
'>);> >printf>(>'The file is now closed.'>);> >}> > >return> 0;> }> |
>
>Výstup
The file is now opened. Data successfully written in file GfgTest.c The file is now closed.>
Tento program vytvoří soubor s názvem GfgTest.c ve stejném adresáři jako zdrojový soubor, který bude obsahovat následující text: techcodeview.com-A Computer Science Portal for Geeks.
Příklad 2: Program pro otevření souboru, čtení z něj a zavření souboru
C
// C program to Open a File,> // Read from it, And Close the File> #include> #include> int> main()> {> >// Declare the file pointer> >FILE>* filePointer;> >// Declare the variable for the data to be read from> >// file> >char> dataToBeRead[50];> >// Open the existing file GfgTest.c using fopen()> >// in read mode using 'r' attribute> >filePointer =>fopen>(>'GfgTest.c'>,>'r'>);> >// Check if this filePointer is null> >// which maybe if the file does not exist> >if> (filePointer == NULL) {> >printf>(>'GfgTest.c file failed to open.'>);> >}> >else> {> >printf>(>'The file is now opened.
'>);> >// Read the dataToBeRead from the file> >// using fgets() method> >while> (>fgets>(dataToBeRead, 50, filePointer)> >!= NULL) {> >// Print the dataToBeRead> >printf>(>'%s'>, dataToBeRead);> >}> >// Closing the file using fclose()> >fclose>(filePointer);> >printf>(> >'Data successfully read from file GfgTest.c
'>);> >printf>(>'The file is now closed.'>);> >}> >return> 0;> }> |
>
>
Výstup
The file is now opened. techcodeview.com-A Computer Science Portal for Geeks Data successfully read from file GfgTest.c The file is now closed.>
Tento program načte text ze souboru s názvem GfgTest.c, který jsme vytvořili v předchozím příkladu, a vytiskne jej v konzole.
Čtení a zápis do binárního souboru
Doposud jsme diskutovali pouze o operacích s textovými soubory. Operace s binárním souborem jsou s malým rozdílem podobné operacím s textovým souborem.
Otevření binárního souboru
K otevření souboru v binárním režimu používáme přístupový režim rb, rb+, ab, ab+, wb a wb+ ve funkci fopen(). V binárním názvu souboru také používáme příponu souboru .bin.
Příklad
fptr = fopen('filename.bin', 'rb');> Zápis do binárního souboru
K zápisu dat do binárního souboru používáme funkci fwrite(). Data se zapisují do binárního souboru v počtu bitů (0 a 1).
Syntaxe fwrite()
size_t fwrite (const void * ptr , size_t size , size_t nmemb , FILE * file_pointer );>
Parametry:
- ptr: ukazatel na blok paměti, který má být zapsán.
- velikost: velikost každého prvku, který má být zapsán (v bajtech).
- nmemb: počet prvků.
- file_pointer : Ukazatel FILE na proud výstupního souboru.
Návratová hodnota:
- Počet zapsaných objektů.
Příklad: Program pro zápis do binárního souboru pomocí fwrite()
C
// C program to write to a Binary file using fwrite()> #include> #include> struct> threeNum {> >int> n1, n2, n3;> };> int> main()> {> >int> n;> >// Structure variable declared here.> >struct> threeNum num;> >FILE>* fptr;> >if> ((fptr =>fopen>(>'C:program.bin'>,>'wb'>)) == NULL) {> >printf>(>'Error! opening file'>);> >// If file pointer will return NULL> >// Program will exit.> >exit>(1);> >}> >int> flag = 0;> >// else it will return a pointer to the file.> >for> (n = 1; n <5; ++n) {> >num.n1 = n;> >num.n2 = 5 * n;> >num.n3 = 5 * n + 1;> >flag =>fwrite>(&num,>sizeof>(>struct> threeNum), 1,> >fptr);> >}> >// checking if the data is written> >if> (!flag) {> >printf>(>'Write Operation Failure'>);> >}> >else> {> >printf>(>'Write Operation Successful'>);> >}> >fclose>(fptr);> > >return> 0;> }> |
>
>Výstup
Write Operation Successful>
Čtení z binárního souboru
Funkci fread() lze použít ke čtení dat z binárního souboru v C. Data jsou ze souboru čtena ve stejné podobě, v jaké jsou uložena, tj. v binární podobě.
Syntaxe fread()
size_t fread (void * ptr , size_t size , size_t nmemb , FILE * file_pointer );>
Parametry:
- ptr: ukazatel na blok paměti ke čtení.
- velikost: velikost každého prvku ke čtení (v bajtech).
- nmemb: počet prvků.
- file_pointer : Ukazatel FILE na proud vstupního souboru.
Návratová hodnota:
- Počet zapsaných objektů.
Příklad: Program pro čtení z binárního souboru pomocí fread()
C
// C Program to Read from a binary file using fread()> #include> #include> struct> threeNum {> >int> n1, n2, n3;> };> int> main()> {> >int> n;> >struct> threeNum num;> >FILE>* fptr;> >if> ((fptr =>fopen>(>'C:program.bin'>,>'rb'>)) == NULL) {> >printf>(>'Error! opening file'>);> >// If file pointer will return NULL> >// Program will exit.> >exit>(1);> >}> >// else it will return a pointer to the file.> >for> (n = 1; n <5; ++n) {> >fread>(&num,>sizeof>(>struct> threeNum), 1, fptr);> >printf>(>'n1: %d n2: %d n3: %d
'>, num.n1, num.n2,> >num.n3);> >}> >fclose>(fptr);> >return> 0;> }> |
>
>
Výstup
n1: 1 n2: 5 n3: 6 n1: 2 n2: 10 n3: 11 n1: 3 n2: 15 n3: 16 n1: 4 n2: 20 n3: 21>
fseek() v C
Pokud máme v souboru více záznamů a potřebujeme přistupovat ke konkrétnímu záznamu, který je na určité pozici, musíme pro získání záznamu projít všechny záznamy před ním. Tím ztratíte spoustu paměti a provozního času. Ke snížení spotřeby paměti a provozní doby můžeme použít fseek() který poskytuje snazší způsob, jak se dostat k požadovaným datům. Funkce fseek() v C hledá kurzor na daný záznam v souboru.
Syntaxe pro fseek()
int fseek(FILE *ptr, long int offset, int pos);>
Příklad fseek()
C
// C Program to demonstrate the use of fseek() in C> #include> int> main()> {> >FILE>* fp;> >fp =>fopen>(>'test.txt'>,>'r'>);> >// Moving pointer to end> >fseek>(fp, 0, SEEK_END);> >// Printing position of pointer> >printf>(>'%ld'>,>ftell>(fp));> >return> 0;> }> |
>
>
Výstup
81>
rewind() v C
The přetočit() funkce se používá k přesunutí ukazatele souboru na začátek souboru. Může být použit místo fseek(), když chcete, aby byl ukazatel na soubor na začátku.
Syntaxe funkce rewind()
rewind ( file_pointer );>
Příklad
C
vznášející se v css
// C program to illustrate the use of rewind> #include> int> main()> {> >FILE>* fptr;> >fptr =>fopen>(>'file.txt'>,>'w+'>);> >fprintf>(fptr,>'Geeks for Geeks
'>);> >// using rewind()> >rewind>(fptr);> >// reading from file> >char> buf[50];> >fscanf>(fptr,>'%[^
]s'>, buf);> >printf>(>'%s'>, buf);> >return> 0;> }> |
>
>Výstup
Geeks for Geeks>
Další funkce pro operace se soubory C
Následující tabulka uvádí některé další funkce, které lze použít k provádění operací se soubory nebo k pomoci při jejich provádění.
| Funkce | Popis |
|---|---|
| fopen() | Používá se k vytvoření souboru nebo k otevření souboru. |
| fclose() | Používá se k uzavření souboru. |
| fgets() | Používá se ke čtení souboru. |
| fprintf() | Slouží k zápisu bloků dat do souboru. |
| fscanf() | Používá se ke čtení bloků dat ze souboru. |
| getc() | Používá se ke čtení jednoho znaku do souboru. |
| putc() | Slouží k zápisu jednoho znaku do souboru. |
| fseek() | Slouží k nastavení pozice ukazatele souboru na uvedené místo. |
| ftell() | Používá se k vrácení aktuální pozice ukazatele souboru. |
| přetočit() | Používá se k nastavení ukazatele souboru na začátek souboru. |
| putw() | Používá se k zápisu celého čísla do souboru. |
| getw() | Používá se ke čtení celého čísla ze souboru. |