C Program pro čtení obsahu celého souboru
C programovací jazyk podporuje čtyři předdefinované funkce pro čtení obsahu ze souboru, definované v záhlaví souboru stdio.h:
- fgetc() – Tato funkce se používá ke čtení jednoho znaku ze souboru.
- fgets() – Tato funkce se používá ke čtení řetězců ze souborů.
- fscanf() – Tato funkce se používá ke čtení formátovaného vstupu ze souboru.
- fread() – Tato funkce se používá ke čtení bloku nezpracovaných bajtů ze souborů. To se používá ke čtení binárních souborů.
Kroky ke čtení souboru:
- Otevřete soubor pomocí funkce fopen() a uložte odkaz na soubor do ukazatele FILE.
- Čtěte obsah souboru pomocí kterékoli z těchto funkcí fgetc(), fgets(), fscanf() nebo fread().
- Soubor zavřete soubor pomocí funkce fclose().
Začněme podrobně diskutovat o každé z těchto funkcí.
fgetc()
fgetc() čte znaky, na které v daný okamžik ukazuje ukazatel funkce. Při každém úspěšném čtení vrátí znak (hodnotu ASCII) přečtený z proudu a posune čtenou pozici na další znak. Tato funkce vrací konstantní EOF (-1), když není žádný obsah ke čtení nebo je čtení neúspěšné.
Syntax:
int fgetc(SOUBOR *ptr);
Přístup:
- Tento program čte celý obsah souboru pomocí této funkce čtením znaků jeden po druhém.
- Použije se smyčka Do-While, která bude číst znak, dokud nedosáhne konce souboru.
- Když dosáhne konce, vrátí znak EOF (-1).
Použití EOF:
Níže je uveden program C pro implementaci výše uvedeného přístupu –
C
// C program to implement> // the above approach> #include> #include> #include> // Driver code> int> main()> {> > FILE> * ptr;> > char> ch;> > // Opening file in reading mode> > ptr => fopen> (> 'test.txt'> ,> 'r'> );> > if> (NULL == ptr) {> > printf> (> 'file can't be opened
'> );> > }> > printf> (> 'content of this file are
'> );> > // Printing what is written in file> > // character by character using loop.> > do> {> > ch => fgetc> (ptr);> > printf> (> '%c'> , ch);> > // Checking if character is not EOF.> > // If it is EOF stop reading.> > }> while> (ch != EOF);> > // Closing the file> > fclose> (ptr);> > return> 0;> }> |
Vložte soubor:
techcodeview.com | A computer science portal for geeks
Výstup:
Ve výše uvedeném kódu je přístup číst jeden znak ze souboru a zkontrolovat, zda to není EOF, pokud není, vytisknout jej a pokud je přestat číst.
Použití feof():
Funkce feof() vezme ukazatel na soubor jako argument a vrátí hodnotu true, pokud ukazatel dosáhne konce souboru.
Syntax:
int feof(FILE *ptr);
Přístup:
- V tomto přístupu se znak čte pomocí fgetc().
- Pomocí funkce feof() zkontrolujte konec souboru. protože feof() vrátí true poté, co dosáhne konce.
- Použijte logický operátor NOT(!), aby se při dosažení koncové podmínky stal false a smyčka se zastavila.
Níže je uveden program C pro implementaci výše uvedeného přístupu:
C
// C program to implement> // the above approach> #include> #include> #include> // Driver code> int> main()> {> > FILE> * ptr;> > char> ch;> > ptr => fopen> (> 'test.txt'> ,> 'r'> );> > if> (NULL == ptr) {> > printf> (> 'file can't be opened
'> );> > }> > printf> (> 'content of this file are
'> );> > while> (!> feof> (ptr)) {> > ch => fgetc> (ptr);> > printf> (> '%c'> , ch);> > }> > fclose> (ptr);> > return> 0;> }> |
Vložte soubor:
techcodeview.com | A computer science portal for geeks
Výstup:
fgets()
fgets() čte ze souboru jeden řetězec po druhém. fgets() vrátí řetězec, pokud je úspěšně přečten funkcí, nebo vrátí NULL, pokud nelze číst.
Syntax:
char * fgets(char *str, velikost int, FILE * ptr);
Tady,
str: Je to řetězec, do kterého fgets() ukládá řetězec po jeho načtení ze souboru.
velikost: Je to maximální počet znaků ke čtení ze streamu.
ptr: Je to ukazatel souboru.
Přístup:
- V tomto přístupu se obsah souboru čte jeden znak po druhém, dokud nedosáhneme konce souboru.
- Když se dostaneme na konec souboru, fgets() nemůže číst a vrátí NULL a program přestane číst.
Níže je uveden program C pro implementaci výše uvedeného přístupu:
C
// C program to implement> // the above approach> #include> #include> #include> // Driver code> int> main()> {> > FILE> * ptr;> > char> str[50];> > ptr => fopen> (> 'test.txt'> ,> 'a+'> );> > if> (NULL == ptr) {> > printf> (> 'file can't be opened
'> );> > }> > printf> (> 'content of this file are
'> );> > while> (> fgets> (str, 50, ptr) != NULL) {> > printf> (> '%s'> , str);> > }> > fclose> (ptr);> > return> 0;> }> |
Vložte soubor:
techcodeview.com | A computer science portal for geeks
Výstup:
fscanf()
fscanf() čte formátovaný vstup ze streamu.
Syntax:
int fscanf(FILE *ptr, const char *formát, …)
Přístup:
- fscanf čte formátovaná data ze souborů a ukládá je do proměnných.
- Data ve vyrovnávací paměti se tisknou na konzoli, dokud není dosaženo konce souboru.
C++
// C program to implement> // the above approach> #include> // Driver code> int> main()> {> > FILE> * ptr => fopen> (> 'abc.txt'> ,> 'r'> );> > if> (ptr == NULL) {> > printf> (> 'no such file.'> );> > return> 0;> > }> > /* Assuming that test.txt has content> > in below format> > NAME AGE CITY> > abc 12 hyderbad> > bef 25 delhi> > cce 65 bangalore */> > char> buf[100];> > while> (> fscanf> (ptr,> '%*s %*s %s '> ,> > buf)> > == 1)> > printf> (> '%s
'> , buf);> > return> 0;> }> |
Výstup:
fread()
fread() usnadňuje čtení bloků dat ze souboru. Například v případě čtení struktury ze souboru se stává snadno čitelná pomocí fread.
Syntax:
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
ptr: Toto je ukazatel na blok paměti s minimální velikostí size*nmemb bajtů.
velikost: Toto je velikost v bajtech každého prvku, který se má číst.
nmemb: Toto je počet prvků, z nichž každý má velikost bajtů.
proud: Toto je ukazatel na objekt FILE, který určuje vstupní proud.
Přístup:
- Nejprve načte počet objektů, každý o velikosti bajtů z daného vstupního proudu.
- Celkový počet přečtených bajtů v případě úspěchu je (velikost*počet).
- Podle ne. přečtených znaků, pozice indikátorového souboru se zvýší.
- Pokud čtené objekty nejsou triviálně kopírovatelné, pak je chování nedefinované a pokud je hodnota velikosti nebo počtu rovna nule, pak tento program jednoduše vrátí 0.
C++
// C program to implement> // the above approach> #include> #include> #include> // Structure to store> // course details> struct> Course {> > char> cname[30];> > char> sdate[30];> };> // Driver code> int> main()> {> > FILE> * of;> > of => fopen> (> 'test.txt'> ,> 'w'> );> > if> (of == NULL) {> > fprintf> (stderr,> > '
Error to open the file
'> );> > exit> (1);> > }> > struct> Course inp1 = {> 'Algorithms'> ,> > '30OCT'> };> > struct> Course inp2 = {> 'DataStructures'> ,> > '28SEPT'> };> > struct> Course inp3 = {> 'Programming'> ,> > '1NOV'> };> > fwrite> (&inp1,> sizeof> (> struct> Course),> > 1, of);> > fwrite> (&inp2,> sizeof> (> struct> Course),> > 1, of);> > fwrite> (&inp3,> sizeof> (> struct> Course),> > 1, of);> > if> (> fwrite> != 0)> > printf> (> 'Contents to file written successfully !
'> );> > else> > printf> (> 'Error writing file !
'> );> > fclose> (of);> > // File pointer to read from file> > FILE> * inf;> > struct> Course inp;> > inf => fopen> (> 'test.txt'> ,> 'r'> );> > if> (inf == NULL) {> > fprintf> (stderr,> > '
Error to open the file
'> );> > exit> (1);> > }> > while> (> fread> (&inp,> sizeof> (> struct> Course),> > 1, inf))> > printf> (> 'Course Name = %s Started = %s
'> ,> > inp.cname, inp.sdate);> > fclose> (inf);> }> |
Výstup: