logo

Основи обробки файлів у C

Передача файлів у C — це процес, під час якого ми створюємо, відкриваємо, читаємо, записуємо та закриваємо операції над файлом. Мова C надає різні функції, такі як fopen(), fwrite(), fread(), fseek(), fprintf() тощо для виконання введення, виведення та багатьох різних операцій із файлами C у нашій програмі.

Навіщо нам потрібна обробка файлів у C?

Поки що операції з використанням програми C виконуються на підказці/терміналі, які ніде не зберігаються. Вихідні дані видаляються, коли програма закривається. Але в індустрії програмного забезпечення більшість програм написані для зберігання інформації, отриманої з програми. Використання обробки файлів - це саме те, що вимагає ситуація.



Щоб зрозуміти, чому важлива робота з файлами, давайте розглянемо кілька особливостей використання файлів:

  • Повторне використання: Дані, що зберігаються у файлі, можна отримати, оновити та видалити будь-де та будь-коли, що забезпечує високу можливість повторного використання.
  • Портативність: Без втрати даних файли можна передати іншому в комп'ютерній системі. Завдяки цій функції ризик неправильного кодування зведений до мінімуму.
  • Ефективний: Для деяких програм може знадобитися велика кількість введених даних. Обробка файлів дозволяє легко отримати доступ до частини файлу за допомогою кількох інструкцій, що економить багато часу та зменшує ймовірність помилок.
  • Ємність зберігання: Файли дозволяють зберігати велику кількість даних, не турбуючись про те, щоб одночасно зберігати все в програмі.

Типи файлів у C

Файл можна класифікувати на два типи залежно від способу зберігання даних. Вони такі:

  • Текстові файли
  • Бінарні файли



1. Текстові файли

Текстовий файл містить дані в форма символів ASCII і зазвичай використовується для зберігання потоку символів.

  • Кожен рядок у текстовому файлі закінчується символом нового рядка (‘ ’).
  • Його можна читати або писати будь-яким текстовим редактором.
  • Зазвичай їх зберігають с .txt розширення файлу.
  • Текстові файли також можна використовувати для зберігання вихідного коду.

2. Бінарні файли

Двійковий файл містить дані в двійкова форма (тобто 0 і 1) замість символів ASCII. Вони містять дані, які зберігаються подібно до того, як вони зберігаються в основній пам’яті.

  • Бінарні файли можуть бути створені лише всередині програми, і їх вміст може бути прочитано лише програмою.
  • Більш безпечні, оскільки їх нелегко прочитати.
  • Зазвичай їх зберігають с .bin розширення файлу.

C Операції з файлами

Операції з файлами C стосуються різних можливих операцій, які ми можемо виконувати над файлом на C, наприклад:



  1. Створення нового файлу – fopen() з такими атрибутами, як a або a+ або w або w+
  2. Відкриття наявного файлу – fopen()
  3. Читання з файлу – fscanf() або fgets()
  4. Запис у файл – fprintf() або fputs()
  5. Перехід до певного місця у файлі – fseek() , перемотування()
  6. Закриття файлу – fclose()

У виділеному тексті згадується функція C, яка використовується для виконання операцій з файлами.

Функції для файлових операцій C

обробка файлів у c

Покажчик файлу в C

Покажчик файлу - це посилання на певну позицію у відкритому файлі. Він використовується в обробці файлів для виконання всіх файлових операцій, таких як читання, запис, закриття тощо. Ми використовуємо ФАЙЛ макрос для оголошення змінної покажчика файлу. Макрос FILE визначено всередині файл заголовка.

Синтаксис покажчика файлу

  FILE*     pointer_name  ;>

File Pointer використовується майже в усіх файлових операціях у C.

Відкрийте файл на C

Щоб відкрити файл на C, fopen() використовується з іменем файлу або шляхом до нього разом із необхідними режимами доступу.

Синтаксис fopen()

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

Параметри

  • ім'я_файлу : ім'я файлу, якщо він знаходиться в тому ж каталозі, що й вихідний файл. В іншому випадку повний шлях.
  • access_mode: Визначає, для якої операції відкривається файл.

Повернене значення

  • Якщо файл відкрито успішно, повертає на нього покажчик файлу.
  • Якщо файл не відкрито, повертає NULL.

Режими відкриття файлів у C

Режими відкриття файлу або режими доступу визначають дозволені операції з файлом, який потрібно відкрити. Вони передаються як аргумент функції fopen(). Деякі з найпоширеніших режимів доступу до файлів наведено нижче:

Режими відкриття опис
r Пошук файлу. Якщо файл відкрито успішно, fopen() завантажує його в пам’ять і встановлює покажчик, який вказує на перший символ у ньому. Якщо файл неможливо відкрити, fopen( ) повертає NULL.
рб Відкритий для читання в двійковому режимі. Якщо файл не існує, fopen() повертає NULL.
в Відкритий для запису в текстовому режимі. Якщо файл існує, його вміст перезаписується. Якщо файл не існує, створюється новий файл. Повертає NULL, якщо неможливо відкрити файл.
wb Відкритий для запису в двійковому режимі. Якщо файл існує, його вміст перезаписується. Якщо файл не існує, він буде створений.
a Пошук файлу. Якщо файл відкрито успішно, fopen() завантажує його в пам’ять і встановлює покажчик, який вказує на останній символ у ньому. Відкривається тільки в режимі додавання. Якщо файл не існує, створюється новий файл. Повертає NULL, якщо неможливо відкрити файл.
аб Відкрити для додавання в двійковому режимі. Дані додаються в кінець файлу. Якщо файл не існує, він буде створений.
r+ Пошук файлу. Він успішно відкритий. fopen() завантажує його в пам’ять і встановлює покажчик, який вказує на перший символ у ньому. Повертає NULL, якщо неможливо відкрити файл.
rb+ Відкритий як для читання, так і для запису в двійковому режимі. Якщо файл не існує, fopen() повертає NULL.
w+ Пошук файлу. Якщо файл існує, його вміст перезаписується. Якщо файл не існує, буде створено новий файл. Повертає NULL, якщо неможливо відкрити файл.
wb+ Відкритий як для читання, так і для запису в двійковому режимі. Якщо файл існує, його вміст перезаписується. Якщо файл не існує, він буде створений.
a+ Пошук файлу. Якщо файл відкрито успішно, fopen() завантажує його в пам’ять і встановлює покажчик, який вказує на останній символ у ньому. Він відкриває файл як у режимі читання, так і в режимі додавання. Якщо файл не існує, створюється новий файл. Повертає NULL, якщо неможливо відкрити файл.
ab+ Відкритий як для читання, так і для додавання в двійковому режимі. Якщо файл не існує, він буде створений.

Як зазначено вище, якщо ви хочете виконувати операції з двійковим файлом, вам потрібно додати «b» в кінці. Наприклад, замість w потрібно використовувати wb, замість a+ потрібно використовувати a+b.

Приклад відкриття файлу

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

>

>

Вихід

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

Файл не відкривається, оскільки його немає у вихідному каталозі. Але функція fopen() також здатна створити файл, якщо він не існує. Це показано нижче

Створіть файл на C

Функція fopen() може не тільки відкрити файл, але й створити файл, якщо він ще не існує. Для цього ми повинні використовувати режими, які дозволяють створити файл, якщо він не знайдений, наприклад w, w+, wb, wb+, a, a+, ab і ab+.

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

Приклад відкриття файлу

C




aes проти des

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

>

>

Вихід

The file is created Successfully.>

Читання з файлу

Операцію читання файлу в C можна виконати за допомогою функцій fscanf() або fgets(). Обидві функції виконували ті самі операції, що й scanf і gets, але з додатковим параметром, покажчиком на файл. Існують також інші функції, які ми можемо використовувати для читання з файлу. Такі функції перераховані нижче:

функція опис
fscanf() Використовуйте відформатований рядок і список змінних аргументів, щоб отримати вхідні дані з файлу.
fgets() Введіть весь рядок із файлу.
fgetc() Читає один символ із файлу.
отримати() Читає число з файлу.
страх() Читає вказані байти даних із двійкового файлу.

Отже, від вас залежить, чи хочете ви читати файл рядок за рядком або символ за символом.

приклад:

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

Функція getc() і деякі інші функції читання файлів повертають EOF (кінець файлу), коли вони досягають кінця файлу під час читання. EOF вказує на кінець файлу, а його значення визначається реалізацією.

Примітка: Тут слід зауважити, що після читання певної частини файлу покажчик файлу буде автоматично переміщено в кінець останнього прочитаного символу.

Запис у файл

Операції запису файлів можуть виконуватися функціями fprintf() і fputs(), схожими на операції читання. Програмування на C також надає деякі інші функції, які можна використовувати для запису даних у файл, наприклад:

функція опис
fprintf() Подібно до printf(), ця функція використовує відформатований рядок і список змінних аргументів для друку виведення у файл.
fputs() Друкує весь рядок у файлі та новий рядок у кінці.
fputc() Друкує один символ у файл.
fputw() Друкує число у файл.
fwrite() Ця функція записує вказану кількість байтів у двійковий файл.

приклад:

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

Закриття файлу

Функція fclose() використовується для закриття файлу. Після успішних операцій з файлами ви завжди повинні закрити файл, щоб видалити його з пам'яті.

Синтаксис fclose()

  fclose  (  file_pointer  );>

де file_pointer є вказівником на відкритий файл.

приклад:

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

Приклади передачі файлів у C

Приклад 1: Програма для створення файлу, запису в нього та закриття файлу

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

>

>

Вихід

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

Ця програма створить файл під назвою GfgTest.c у тому ж каталозі, що й вихідний файл, який міститиме такий текст: techcodeview.com-Комп’ютерний науковий портал для гіків.

приклад 2: Програма для відкриття файлу, читання з нього та закриття файлу

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

>

>

Вихід

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

Ця програма читає текст із файлу GfgTest.c, який ми створили в попередньому прикладі, і друкує його в консолі.

Читання та запис у бінарний файл

Досі ми обговорювали лише операції з текстовими файлами. Операції з двійковим файлом подібні до операцій з текстовим файлом з невеликими відмінностями.

Відкриття бінарного файлу

Щоб відкрити файл у двійковому режимі, ми використовуємо режим доступу rb, rb+, ab, ab+, wb і wb+ у функції fopen(). Ми також використовуємо розширення .bin у назві двійкового файлу.

приклад

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

Запис у бінарний файл

Ми використовуємо функцію fwrite() для запису даних у двійковий файл. Дані записуються у двійковий файл із бітами (0 та 1).

Синтаксис fwrite()

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

Параметри:

  • ptr: покажчик на блок пам'яті, який потрібно записати.
  • розмір: розмір кожного елемента для запису (у байтах).
  • nmemb: кількість елементів.
  • file_pointer : покажчик FILE на потік вихідного файлу.

Повернене значення:

  • Кількість написаних предметів.

приклад: Програма для запису у бінарний файл за допомогою 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;> }>

>

>

Вихід

Write Operation Successful>

Читання з бінарного файлу

Функцію fread() можна використовувати для читання даних із двійкового файлу в C. Дані зчитуються з файлу в тій самій формі, у якій вони зберігаються, тобто у двійковій формі.

Синтаксис fread()

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

Параметри:

  • ptr: покажчик на блок пам'яті для читання.
  • розмір: розмір кожного елемента для читання (у байтах).
  • nmemb: кількість елементів.
  • file_pointer : вказівник FILE на вхідний файловий потік.

Повернене значення:

  • Кількість написаних предметів.

приклад: Програма для читання з двійкового файлу за допомогою 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;> }>

>

>

Вихід

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

Якщо у файлі є кілька записів і нам потрібно отримати доступ до певного запису, який знаходиться в певній позиції, нам потрібно прокрутити всі записи перед ним, щоб отримати запис. Це призведе до втрати пам’яті та робочого часу. Щоб зменшити споживання пам'яті та час роботи, ми можемо використовувати fseek() що забезпечує легший спосіб отримати необхідні дані. Функція fseek() у C шукає курсор до заданого запису у файлі.

Синтаксис для fseek()

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

Приклад 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;> }>

>

>

довгий рядок java

Вихід

81>

rewind() у C

The перемотати() функція використовується для переведення покажчика файлу на початок файлу. Його можна використовувати замість fseek(), якщо вам потрібен покажчик файлу на початку.

Синтаксис rewind()

  rewind   (  file_pointer  );>

приклад

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

>

>

Вихід

Geeks for Geeks>

Більше функцій для операцій з файлами C

У наведеній нижче таблиці перераховано ще деякі функції, які можна використовувати для виконання операцій з файлами або допомоги в їх виконанні.

Функції опис
fopen() Він використовується для створення або відкриття файлу.
fclose() Використовується для закриття файлу.
fgets() Він використовується для читання файлу.
fprintf() Він використовується для запису блоків даних у файл.
fscanf() Він використовується для читання блоків даних із файлу.
getc() Він використовується для читання одного символу у файл.
putc() Він використовується для запису одного символу у файл.
fseek() Він використовується для встановлення позиції вказівника файлу на згадане розташування.
ftell() Він використовується для повернення поточної позиції покажчика файлу.
перемотати() Використовується для встановлення покажчика файлу на початок файлу.
putw() Він використовується для запису цілого числа у файл.
getw() Він використовується для читання цілого числа з файлу.