Program C do odczytu zawartości całego pliku

Język programowania C obsługuje cztery predefiniowane funkcje do odczytu zawartości pliku, zdefiniowanej w pliku nagłówkowym stdio.h:

  1. fgetc() Funkcja ta służy do odczytania pojedynczego znaku z pliku.
  2. fgets() Funkcja ta służy do odczytywania ciągów znaków z plików.
  3. fscanf() Ta funkcja służy do odczytywania sformatowanych danych wejściowych z pliku.
  4. strach() Funkcja ta służy do odczytu bloku surowych bajtów z plików. Służy do odczytu plików binarnych.

Kroki, aby odczytać plik:

  • Otwórz plik za pomocą funkcji fopen() i zapisz odwołanie do pliku we wskaźniku FILE.
  • Przeczytaj zawartość pliku, używając dowolnej z tych funkcji fgetc(), fgets(), fscanf() lub fread().
  • Plik zamknij plik za pomocą funkcji fclose().

Zacznijmy szczegółowo omawiać każdą z tych funkcji.

fgetc()

fgetc() odczytuje w tym momencie znaki wskazane przez wskaźnik funkcji. Po każdym pomyślnym odczycie zwraca znak (wartość ASCII) odczytany ze strumienia i przesuwa pozycję odczytu do następnego znaku. Ta funkcja zwraca stałą wartość EOF (-1), gdy nie ma treści do odczytania lub odczyt zakończył się niepowodzeniem.

Składnia:

int fgetc(PLIK *ptr);

Zbliżać się:

  • Program ten wczytuje całą zawartość pliku, korzystając z tej funkcji, wczytując znaki jeden po drugim.
  • Wykorzystana zostanie pętla Do-While, która będzie czytać znak aż do końca pliku.
  • Kiedy osiągnie koniec, zwraca znak EOF (-1).

Korzystanie z EOF:
Poniżej znajduje się program C realizujący powyższe podejście-

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;> }>

Plik wejściowy:

techcodeview.com | A computer science portal for geeks 

Wyjście:

W powyższym kodzie podejście polega na odczytaniu jednego znaku z pliku i sprawdzeniu, czy nie jest to EOF, jeśli nie, to wydrukowanie go, a jeśli jest, to zaprzestanie czytania.

Używanie feof():
Funkcja feof() przyjmuje wskaźnik pliku jako argument i zwraca wartość true, jeśli wskaźnik dotrze do końca pliku.

Składnia:

int feof(PLIK *ptr);

Zbliżać się:

  • W tym podejściu znak jest odczytywany za pomocą fgetc().
  • Użycie funkcji feof() sprawdza koniec pliku. ponieważ feof() zwraca wartość true po osiągnięciu końca.
  • Użyj operatora logicznego NOT (!), aby po osiągnięciu warunku końcowego stał się fałszywy i pętla się zatrzymała.

Poniżej znajduje się program C realizujący powyższe podejście:

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;> }>

Plik wejściowy:

techcodeview.com | A computer science portal for geeks 

Wyjście:

fgets()

fgets() odczytuje z pliku jeden ciąg znaków na raz. fgets() zwraca ciąg znaków, jeśli został pomyślnie odczytany przez funkcję lub zwraca NULL, jeśli nie można go odczytać.

Składnia:

char * fgets(char *str, int rozmiar, PLIK * ptr);

Tutaj,
str: Jest to ciąg znaków, w którym fgets() przechowuje ciąg znaków po odczytaniu go z pliku.
rozmiar: To maksymalna liczba znaków do odczytania ze strumienia.
pt: To jest wskaźnik pliku.

Zbliżać się:

  • W tym podejściu zawartość pliku jest odczytywana po znaku, aż dotrzemy do końca pliku.
  • Kiedy dotrzemy do końca pliku, fgets() nie może odczytać i zwraca NULL, a program przestanie czytać.

Poniżej znajduje się program C realizujący powyższe podejście:

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;> }>

Plik wejściowy:

techcodeview.com | A computer science portal for geeks 

Wyjście:

fscanf()

fscanf() odczytuje sformatowane dane wejściowe ze strumienia.

Składnia:

int fscanf(PLIK *ptr, const char *format, …)

Zbliżać się:

  • fscanf odczytuje sformatowane dane z plików i zapisuje je w zmiennych.
  • Dane w buforze są drukowane na konsoli aż do osiągnięcia końca pliku.

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;> }>

Wyjście:

strach()

fread() ułatwia odczytywanie bloków danych z pliku. Na przykład, w przypadku odczytu struktury z pliku, odczytanie struktury za pomocą freada staje się łatwym zadaniem.

Składnia:

size_t fread(void *ptr, size_t size, size_t nmemb, PLIK *stream)

pt: Jest to wskaźnik do bloku pamięci o minimalnym rozmiarze size*nmemb bajtów.
rozmiar: Jest to rozmiar w bajtach każdego elementu do odczytania.
nmemb: Jest to liczba elementów, z których każdy ma rozmiar w bajtach.
strumień: Jest to wskaźnik do obiektu FILE, który określa strumień wejściowy.

Zbliżać się:

  • Najpierw odczytuje liczbę obiektów, każdy o rozmiarze size bajtów, z danego strumienia wejściowego.
  • Całkowita ilość bajtów odczytanych w przypadku powodzenia wynosi (rozmiar*liczba).
  • Według nr. odczytanych znaków, zwiększana jest pozycja pliku wskaźnika.
  • Jeśli odczytanych obiektów nie można w trywialny sposób skopiować, wówczas zachowanie jest niezdefiniowane i jeśli wartość size lub count jest równa zero, wówczas program po prostu zwróci 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);> }>

Wyjście: