logo

Podstawy obsługi plików w C

Przekazywanie plików w C to proces, podczas którego tworzymy, otwieramy, czytamy, zapisujemy i zamykamy operacje na pliku. Język C udostępnia różne funkcje, takie jak fopen(), fwrite(), fread(), fseek(), fprintf() itp., umożliwiające wykonywanie w naszym programie operacji wejścia i wyjścia oraz wielu różnych operacji na plikach C.

Dlaczego potrzebujemy obsługi plików w C?

Jak dotąd operacje przy użyciu programu C są wykonywane w wierszu poleceń/terminalu, który nie jest nigdzie przechowywany. Dane wyjściowe są usuwane po zamknięciu programu. Jednak w branży oprogramowania większość programów jest zapisywana w celu przechowywania informacji pobranych z programu. Zastosowanie obsługi plików jest dokładnie tym, czego wymaga sytuacja.



Aby zrozumieć, dlaczego obsługa plików jest ważna, przyjrzyjmy się kilku cechom korzystania z plików:

  • Możliwość ponownego użycia: Do danych przechowywanych w pliku można uzyskać dostęp, zaktualizować je i usunąć w dowolnym miejscu i czasie, zapewniając wysoką możliwość ponownego wykorzystania.
  • Ruchliwość: Bez utraty danych pliki można przenieść na inny w systemie komputerowym. Dzięki tej funkcji ryzyko błędnego kodowania jest zminimalizowane.
  • Wydajny: W przypadku niektórych programów może być wymagana duża ilość danych wejściowych. Obsługa plików pozwala na łatwy dostęp do części pliku za pomocą kilku instrukcji, co pozwala zaoszczędzić dużo czasu i zmniejsza ryzyko błędów.
  • Pojemność przechowywania: Pliki umożliwiają przechowywanie dużej ilości danych bez konieczności martwienia się o jednoczesne przechowywanie wszystkiego w programie.

Typy plików w C

Plik można podzielić na dwa typy w zależności od sposobu, w jaki plik przechowuje dane. Są one następujące:

  • Pliki tekstowe
  • Pliki binarne



1. Pliki tekstowe

Plik tekstowy zawiera dane w formacie formie znaków ASCII i jest powszechnie używany do przechowywania strumienia znaków.

  • Każda linia w pliku tekstowym kończy się znakiem nowej linii („ ”).
  • Można go przeczytać lub zapisać w dowolnym edytorze tekstu.
  • Zazwyczaj są one przechowywane z .tekst rozszerzenie pliku.
  • Pliki tekstowe mogą być również używane do przechowywania kodu źródłowego.

2. Pliki binarne

Plik binarny zawiera dane w formacie forma binarna (tj. 0 i 1) zamiast znaków ASCII. Zawierają dane, które są przechowywane w podobny sposób, jak są przechowywane w pamięci głównej.

producent Linuksa
  • Pliki binarne można tworzyć wyłącznie z poziomu programu, a ich zawartość może być odczytywana wyłącznie przez program.
  • Bezpieczniejsze, ponieważ nie są łatwe do odczytania.
  • Zazwyczaj są one przechowywane z .kosz rozszerzenie pliku.

Operacje na plikach C

Operacje na plikach C odnoszą się do różnych możliwych operacji, które możemy wykonać na pliku w C, takich jak:



  1. Tworzenie nowego pliku – fopen() z atrybutami a, a+, w lub w+
  2. Otwieranie istniejącego pliku – otwórz()
  3. Odczyt z pliku – fscanf() lub fgets()
  4. Zapis do pliku – fprintf() lub fputs()
  5. Przejście do określonej lokalizacji w pliku – szukaj() , przewijanie do tyłu()
  6. Zamykanie pliku – zamknąć()

Podświetlony tekst wspomina o funkcji C używanej do wykonywania operacji na plikach.

Funkcje operacji na plikach C

obsługa plików w c

Wskaźnik pliku w C

Wskaźnik pliku to odniesienie do określonej pozycji w otwartym pliku. Jest używany w obsłudze plików do wykonywania wszystkich operacji na plikach, takich jak odczyt, zapis, zamykanie itp. Używamy PLIK makro deklarujące zmienną wskaźnika pliku. Wewnątrz zdefiniowano makro FILE plik nagłówkowy.

Składnia wskaźnika pliku

  FILE*     pointer_name  ;>

Wskaźnik pliku jest używany w prawie wszystkich operacjach na plikach w C.

Otwórz plik w C

Aby otworzyć plik w C, otwórz() funkcja jest używana z nazwą pliku lub ścieżką pliku wraz z wymaganymi trybami dostępu.

Składnia fopen()

FILE*   fopen  (const char *  file_name  , const char *  access_mode  );>

Parametry

  • Nazwa pliku : nazwa pliku, jeśli znajduje się on w tym samym katalogu co plik źródłowy. W przeciwnym razie pełna ścieżka.
  • tryb dostępu: Określa, dla jakiej operacji plik jest otwierany.

Wartość zwracana

  • Jeśli plik zostanie pomyślnie otwarty, zwraca do niego wskaźnik pliku.
  • Jeśli plik nie zostanie otwarty, zwraca NULL.

Tryby otwierania plików w C

Tryby otwierania plików lub tryby dostępu określają dozwolone operacje na otwieranym pliku. Są one przekazywane jako argument do funkcji fopen(). Poniżej wymieniono niektóre z powszechnie używanych trybów dostępu do plików:

Tryby otwierania Opis
R Wyszukuje plik. Jeśli plik zostanie pomyślnie otwarty, fopen() ładuje go do pamięci i ustawia wskaźnik wskazujący pierwszy w nim znak. Jeśli nie można otworzyć pliku, fopen() zwraca NULL.
rb Otwarte do odczytu w trybie binarnym. Jeśli plik nie istnieje, fopen() zwraca NULL.
w Otwarte do pisania w trybie tekstowym. Jeśli plik istnieje, jego zawartość zostanie nadpisana. Jeśli plik nie istnieje, tworzony jest nowy plik. Zwraca NULL, jeśli nie można otworzyć pliku.
wb Otwarty do zapisu w trybie binarnym. Jeśli plik istnieje, jego zawartość zostanie nadpisana. Jeśli plik nie istnieje, zostanie utworzony.
A Wyszukuje plik. Jeśli plik zostanie pomyślnie otwarty, fopen() ładuje go do pamięci i ustawia wskaźnik wskazujący ostatni znak w nim. Otwiera się tylko w trybie dodawania. Jeśli plik nie istnieje, tworzony jest nowy plik. Zwraca NULL, jeśli nie można otworzyć pliku.
ok Otwórz do dołączenia w trybie binarnym. Dane dodawane są na końcu pliku. Jeśli plik nie istnieje, zostanie utworzony.
r+ Wyszukuje plik. Otwiera się pomyślnie. fopen() ładuje go do pamięci i ustawia wskaźnik wskazujący na pierwszy znajdujący się w nim znak. Zwraca NULL, jeśli nie można otworzyć pliku.
rb+ Otwarty do odczytu i zapisu w trybie binarnym. Jeśli plik nie istnieje, fopen() zwraca NULL.
w+ Wyszukuje plik. Jeśli plik istnieje, jego zawartość zostanie nadpisana. Jeśli plik nie istnieje, tworzony jest nowy plik. Zwraca NULL, jeśli nie można otworzyć pliku.
wb+ Otwarty do odczytu i zapisu w trybie binarnym. Jeśli plik istnieje, jego zawartość zostanie nadpisana. Jeśli plik nie istnieje, zostanie utworzony.
+ Wyszukuje plik. Jeśli plik zostanie pomyślnie otwarty, fopen() ładuje go do pamięci i ustawia wskaźnik wskazujący ostatni znak w nim. Otwiera plik zarówno w trybie odczytu, jak i dodawania. Jeśli plik nie istnieje, tworzony jest nowy plik. Zwraca NULL, jeśli nie można otworzyć pliku.
ab+ Otwarte zarówno do odczytu, jak i dodawania w trybie binarnym. Jeśli plik nie istnieje, zostanie utworzony.

Jak podano powyżej, jeśli chcesz wykonać operacje na pliku binarnym, musisz na końcu dodać „b”. Na przykład zamiast w musisz użyć wb, zamiast a+ musisz użyć a+b.

Przykład otwierania pliku

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

>

>

Wyjście

The file is not opened. The program will now exit.>

Plik nie zostanie otwarty, ponieważ nie istnieje w katalogu źródłowym. Ale funkcja fopen() może również utworzyć plik, jeśli nie istnieje. Pokazano to poniżej

Utwórz plik w C

Funkcja fopen() może nie tylko otworzyć plik, ale także utworzyć plik, jeśli jeszcze nie istnieje. W tym celu musimy użyć trybów, które umożliwiają utworzenie pliku, jeśli nie zostanie znaleziony, takich jak w, w+, wb, wb+, a, a+, ab i ab+.

FILE *fptr; fptr =   fopen  ('  filename.txt  ', '  w  ');>

Przykład otwierania pliku

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

>

>

Wyjście

The file is created Successfully.>

Czytanie z pliku

Operację odczytu pliku w C można wykonać za pomocą funkcji fscanf() lub fgets(). Obie funkcje wykonują te same operacje, co scanf i gets, ale z dodatkowym parametrem, wskaźnikiem pliku. Istnieją również inne funkcje, których możemy użyć do odczytu z pliku. Poniżej wymieniono takie funkcje:

Funkcjonować Opis
fscanf() Użyj sformatowanej listy łańcuchów i zmiennych argumentów, aby pobrać dane wejściowe z pliku.
fgets() Wprowadź całą linię z pliku.
fgetc() Odczytuje pojedynczy znak z pliku.
Dostawać() Odczytuje liczbę z pliku.
strach() Odczytuje określone bajty danych z pliku binarnego.

Zatem od Ciebie zależy, czy chcesz czytać plik linia po linii, czy znak po znaku.

Przykład:

FILE * fptr;  fptr = fopen(fileName.txt, r); fscanf(fptr, '%s %s %s %d', str1, str2, str3, &year); char c = fgetc(fptr);>

Getc() i niektóre inne funkcje odczytu pliku zwracają EOF (End Of File), gdy podczas odczytu dotrą do końca pliku. EOF wskazuje koniec pliku, a jego wartość jest zdefiniowana w implementacji.

Notatka: Należy tu zauważyć, że po przeczytaniu określonej części pliku wskaźnik pliku zostanie automatycznie przesunięty na koniec ostatnio czytanego znaku.

Zapisz do pliku

Operacje zapisu plików można wykonać za pomocą funkcji fprintf() i fputs(), podobnie jak operacje odczytu. Programowanie w C udostępnia również inne funkcje, które można wykorzystać do zapisu danych do pliku, takie jak:

Funkcjonować Opis
fprintf() Podobnie jak printf(), ta funkcja używa sformatowanych ciągów znaków i listy zmiennych argumentów, aby wydrukować dane wyjściowe do pliku.
fput() Drukuje całą linię w pliku i znak nowej linii na końcu.
fputc() Drukuje pojedynczy znak w pliku.
fputw() Drukuje liczbę do pliku.
napisz() Ta funkcja zapisuje określoną ilość bajtów do pliku binarnego.

Przykład:

FILE *fptr ;  fptr = fopen(fileName.txt, w); fprintf(fptr, '%s %s %s %d', 'We', 'are', 'in', 2012); fputc('a', fptr);>

Zamykanie pliku

Do zamknięcia pliku służy funkcja fclose(). Po pomyślnych operacjach na plikach należy zawsze zamknąć plik, aby usunąć go z pamięci.

Składnia fclose()

  fclose  (  file_pointer  );>

gdzie wskaźnik_pliku jest wskaźnikiem do otwartego pliku.

Przykład:

FILE *fptr ; fptr= fopen(fileName.txt, w); ----------   Some file Operations   ------- fclose(fptr);>

Przykłady przekazywania plików w C

Przykład 1: Program do utworzenia pliku, zapisania go i zamknięcia pliku

C




częściowe uzależnienie
// 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;> }>

>

>

Wyjście

The file is now opened. Data successfully written in file GfgTest.c The file is now closed.>

Program ten utworzy plik o nazwie GfgTest.c w tym samym katalogu co plik źródłowy, który będzie zawierał następujący tekst: techcodeview.com-Portal informatyki dla maniaków.

Przykład 2: Program do otwierania pliku, odczytywania go i zamykania pliku

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

Aktor Recha

>

>

Wyjście

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.>

Program ten odczytuje tekst z pliku o nazwie GfgTest.c, który utworzyliśmy w poprzednim przykładzie i wypisuje go w konsoli.

Odczyt i zapis w pliku binarnym

Do tej pory omawialiśmy jedynie operacje na plikach tekstowych. Operacje na pliku binarnym są podobne do operacji na plikach tekstowych, z niewielkimi różnicami.

Otwieranie pliku binarnego

Aby otworzyć plik w trybie binarnym, używamy trybu dostępu rb, rb+, ab, ab+, wb i wb+ w funkcji fopen(). W binarnej nazwie pliku używamy również rozszerzenia pliku .bin.

Przykład

fptr = fopen('filename.bin', 'rb');>

Zapisz do pliku binarnego

Do zapisu danych do pliku binarnego używamy funkcji fwrite(). Dane są zapisywane do pliku binarnego w liczbie bitów (0 i 1).

Składnia fwrite()

size_t   fwrite  (const void *  ptr  , size_t   size  , size_t   nmemb  , FILE *  file_pointer  );>

Parametry:

  • pt: wskaźnik do bloku pamięci, który ma zostać zapisany.
  • rozmiar: rozmiar każdego elementu do zapisania (w bajtach).
  • nmemb: liczba elementów.
  • wskaźnik_pliku : FILE wskaźnik do strumienia pliku wyjściowego.

Wartość zwracana:

  • Liczba zapisanych obiektów.

Przykład: Program do zapisu do pliku binarnego za 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;> }>

>

>

Wyjście

Write Operation Successful>

Odczyt z pliku binarnego

Funkcji fread() można użyć do odczytu danych z pliku binarnego w języku C. Dane są odczytywane z pliku w tej samej formie, w jakiej są przechowywane, tj. w formie binarnej.

tutorial dotyczący iskry

Składnia fread()

size_t   fread  (void *  ptr  , size_t   size  , size_t   nmemb  , FILE *  file_pointer  );>

Parametry:

  • pt: wskaźnik do bloku pamięci do odczytania.
  • rozmiar: rozmiar każdego elementu do odczytania (w bajtach).
  • nmemb: liczba elementów.
  • wskaźnik_pliku : FILE wskaźnik do strumienia pliku wejściowego.

Wartość zwracana:

  • Liczba zapisanych obiektów.

Przykład: Program do odczytu pliku binarnego za 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;> }>

>

>

Wyjście

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() w C

Jeśli mamy wiele rekordów w pliku i potrzebujemy dostępu do konkretnego rekordu, który znajduje się w określonej pozycji, musimy przejść przez wszystkie rekordy przed nim, aby uzyskać rekord. Spowoduje to utratę dużej ilości pamięci i czasu operacyjnego. Aby zmniejszyć zużycie pamięci i czas działania, jaki możemy wykorzystać szukaj() co zapewnia łatwiejszy sposób dotarcia do wymaganych danych. Funkcja fseek() w C szuka kursora do podanego rekordu w pliku.

Składnia fseek()

int fseek(FILE *ptr, long int offset, int pos);>

Przykład 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;> }>

>

>

Wyjście

81>

przewijanie do tyłu() w C

The przewijanie do tyłu() Funkcja służy do przeniesienia wskaźnika pliku na początek pliku. Można jej użyć zamiast fseek(), jeśli chcesz, aby wskaźnik pliku znajdował się na początku.

Składnia przewijania()

  rewind   (  file_pointer  );>

Przykład

C




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

>

numer alfabetu

>

Wyjście

Geeks for Geeks>

Więcej funkcji dla operacji na plikach C

W poniższej tabeli wymieniono więcej funkcji, których można używać do wykonywania operacji na plikach lub wspomagania ich wykonywania.

Funkcje Opis
otwórz() Służy do tworzenia pliku lub otwierania pliku.
zamknąć() Służy do zamykania pliku.
fgets() Służy do odczytu pliku.
fprintf() Służy do zapisywania bloków danych do pliku.
fscanf() Służy do odczytywania bloków danych z pliku.
getc() Służy do wczytywania pojedynczego znaku do pliku.
putc() Służy do zapisywania pojedynczego znaku do pliku.
szukaj() Służy do ustawienia pozycji wskaźnika pliku na wspomnianą lokalizację.
ftel() Służy do zwracania bieżącej pozycji wskaźnika pliku.
przewijanie do tyłu() Służy do ustawiania wskaźnika pliku na początek pliku.
umieścić() Służy do zapisu liczby całkowitej do pliku.
dostać() Służy do odczytu liczby całkowitej z pliku.