Обробка файлів у C++

Обробка файлів у C++

Обробка файлів означає читання та запис у файли (наприклад, .txt, .csv тощо) за допомогою класів, наданих стандартною бібліотекою C++.

  • Програми виконуються в оперативній пам’яті, тобто дані існують лише під час виконання програми, коли програма завершується, усі дані в оперативній пам’яті автоматично втрачаються.
  • Обробка файлів дозволяє зберігати дані у вторинній пам’яті (наприклад, на жорсткому диску або SSD), щоб їх можна було зберегти назавжди, а також зберігати й мати до них доступ навіть після завершення програми.
  • Для файлових операцій C++ надає класи файлового потоку в заголовок, такий як ofstream ifstream fstream.

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

Перед читанням або записом у файл нам спочатку потрібно відкрити його. Відкриття файлу завантажує цей файл в оперативну пам'ять. У C++ ми відкриваємо файл, створюючи до нього потік за допомогою fstream клас, який представляє потік файлу, тобто потік для введення та виведення у файл.

C++
   fstream     str  (  'filename.ext'       mode  );   

де

  • str: Назва потоку
  • ім'я файлу: Ім'я файлу
  • режим : представляє спосіб, у який ми будемо взаємодіяти з файлом.

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

Режим відкриття файлу вказує на те, що файл відкрито для читання, запису або додавання. Нижче наведено список усіх файлових режимів у C++:

Режим опис
ios::in Файл відкрито для читання. Якщо файл не існує, операція відкриття завершується помилкою.
ios::out Файл відкрито для запису: внутрішній буфер потоку підтримує операції виведення.
ios::binary Операції виконуються в двійковому режимі, а не в текстовому.
ios::ate Позиція виведення починається в кінці файлу.
ios::app Усі операції виведення виконуються в кінці файлу, додаючи його до наявного вмісту.
ios::trunk Будь-який вміст, який існував у файлі до його відкриття, відкидається.

Наприклад якщо ми хочемо відкрити файл для читання, ми використовуємо такий режим відкриття:

C++
   fstream     filein  (  'file.txt'       ios  ::  in  );   

Так само, якщо ми хочемо відкрити файл для запису, ми використовуємо наступне:

C++
   fstream     fileout  (  'file.txt'       ios  ::  out  );   

Ці режими також можна комбінувати за допомогою оператора АБО (|). Наприклад, ви можете відкрити потік файлів як у режимі читання, так і в режимі запису, як показано:

C++
   fstream     str  (  'file.txt'       ios  ::  in     |     ios  ::  out  );   

Якщо файл, відкритий у режимі запису, не існує, буде створено новий файл. Але якщо файл, відкритий у режимі читання, не існує, новий файл не створюється та створюється виняток

Інші файлові потоки

fstream це не єдиний файловий потік, який надає C++. Є ще два спеціалізованих потоки:

  • ifstream : означає потік вхідного файлу. Це еквівалентно відкритому fstream у ios::in режим.
  • ofstream : означає потік вихідного файлу. Це еквівалентно відкриттю fstream у ios::out режим.

Наведені вище режими є режимами за замовчуванням для цих потоків. Ці режими не можна змінити, але їх можна об’єднати разом з іншими режимами. Тепер для введення ми також можемо використовувати ifstream, як показано:

C++
   ifstream     filein  (  'file.txt'  );   

Аналогічно для виведення:

C++
   ofstream     fileout  (  'file.txt'  );   

Запис даних у файл

Після відкриття файлу в режимі запису за допомогою будь-якого fstream або ofstream ми можемо виконати операцію запису подібно до cout за допомогою < < operator.

C++
   #include          using     namespace     std  ;   int     main  ()     {      // Open a file      ofstream     file  (  'GFG.txt'  );          // Write the string to the file      file      < <     'Welcome to GeeksforGeeks.'  ;      return     0  ;   }   
писатиGFG.текст

Читання даних із файлу

Після відкриття файлу в режимі читання за допомогою fstream або ifstream ми можемо виконати операцію запису подібним чином, як і з cin, використовуючи >> оператор.

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      file     >>     s  ;      cout      < <     'Read String: '      < <     s  ;      return     0  ;   }   


Вихід

 Read String: Welcome  

Це така ж проблема, як і cin. Введення виконується лише до першого пробілу. Щоб уникнути цього, ми можемо використовувати getline() функція, як показано:

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      getline  (  file       s  );      cout      < <     'Read String: '      < <     s  ;      return     0  ;   }   


Вихід

 Read String: Welcome to GeeksforGeeks.  

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

Закриття файлу означає закриття пов’язаного потоку та звільнення ресурсів, які ми використовуємо. Важливо закрити файл після того, як ви закінчите з ним, особливо в довго запущених програмах, щоб уникнути витоку пам’яті, втрати даних тощо.

У C++ файли закриваються за допомогою закрити() функція-член, яка присутня в усіх файлових потоках.

C++
   #include          using     namespace     std  ;   int     main  ()   {      // Open a file in read mode      ifstream     file  (  'GFG.txt'  );      string     s  ;      // Read string from the file      getline  (  file       s  );      cout      < <     'Read String: '      < <     s  ;      // Close the file      file  .  close  ();      return     0  ;   }   


Вихід

 Read String: Welcome to GeeksforGeeks.  

Помилки в обробці файлів

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

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

Бувають випадки, коли файл не відкривається з різних причин, наприклад, його не існує або програма не має дозволу на його відкриття тощо. У цьому випадку ми можемо використати is_open() функція-член класів файлового потоку, щоб перевірити, чи успішно відкритий файл чи ні.

C++
   #include          using     namespace     std  ;   int     main  ()     {      fstream     file  (  'nonexistent_file.txt'       ios  ::  in  );      // Check if the file is opened      if     (  !  file  .  is_open  ())     {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      file  .  close  ();      return     0  ;   }   


Вихід

 Error: Unable to open file!  

Збій читання/запису даних

Іншою поширеною помилкою є неможливість читання або запису даних через такі причини, як неправильний режим тощо. У цьому випадку ми можемо перевіряти операції після кожної спроби читання/запису. Наприклад, читання за допомогою getline() можна перевірити, як показано:

C++
   #include          using     namespace     std  ;   int     main  ()     {      fstream     file  (  'GFG.txt'       ios  ::  out  );      if     (  !  file  .  is_open  ())     {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      string     line  ;          // Checking if getline() read successfully or not      if     (  !  getline  (  file       line  ))      cerr      < <     'Error: Failed to read data'      < <     endl  ;      file  .  close  ();      return     0  ;   }   


Вихід

 Error: Failed to read data  

Помилка кінця файлу (EOF).

Спроба прочитати файл за межами кінця може спричинити помилку EOF. Це може статися, якщо ви не перевірите кінець файлу перед читанням. Ми можемо перевірити EOF за допомогою eof() функція-член.

C++
   #include          using     namespace     std  ;   int     main  ()   {      ifstream     file  (  'GFG.txt'  );      if     (  !  file  .  is_open  ())      {      cerr      < <     'Error: Unable to open file!'      < <     endl  ;      return     1  ;      }      string     line  ;      while     (  getline  (  file       line  ))      cout      < <     line      < <     endl  ;      // Check for eof      if     (  file  .  eof  ())      cout      < <     'Reached end of file.'      < <     endl  ;      else      cerr      < <     'Error: File reading failed!'      < <     endl  ;      file  .  close  ();      return     0  ;   }   


Вихід

 Reached end of file.  

Зверніть увагу, що ми також перевірили операцію читання перед перевіркою EOF як getline() тільки повернеться nullptr навіть якщо читання не вдається з будь-якої причини.

Робота з бінарними файлами

У C++ ми також можемо впоратися двійкові файли які зберігають дані в необробленому форматі. Для читання та запису двійкових даних необхідно використовувати ios::binary прапор під час створення/відкриття бінарного файлу.

Записати в двійковий файл

Щоб записати дані у двійковий файл, нам спочатку потрібно відкрити або створити файл ios::binary режим.

C++
   #include         #include         #include          using     namespace     std  ;   int     main  ()   {      string     str     =     'Welcome to GeeksForGeeks'  ;      // Open a binary file for writing      ofstream     file  (  'fileBin.bin'       ios  ::  binary  );      // Check if the file is open      if     (  !  file  )      {      cerr      < <     'Error opening the file for writing.'  ;      return     1  ;      }      // Write the length of the string (size) to file first      size_t     strLength     =     str  .  length  ();      file  .  write  (  reinterpret_cast   <  const     char     *>  (  &  strLength  )     sizeof  (  strLength  ));      // Write the string to the binary file      file  .  write  (  str  .  c_str  ()     strLength  );      // Close the file      file  .  close  ();      return     0  ;   }   


Вихід

writeBinaryБінарний файл

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

Так само, як ми відкриваємо файл у двійковому режимі, щоб записати дані, щоб прочитати дані з двійкового файлу, ми повинні відкрити файл у режимі читання за допомогою ios::in .

Синтаксис:

C++
   fstream     fileInstance  (  'fileName.bin'       ios  ::  in  |     ios  ::  binary  );   
C++
   #include         #include         #include          using     namespace     std  ;   int     main  ()   {      string     str  ;      // Open the binary file for reading      fstream     file  (  'fileBin.bin'       ios  ::  in     |     ios  ::  binary  );      // Check if the file is open      if     (  !  file  )      {      cerr      < <     'Error opening the file for reading.'  ;      return     1  ;      }      // Read the length of the string (size) from the file      size_t     strLength  ;      file  .  read  (  reinterpret_cast   <  char     *>  (  &  strLength  )     sizeof  (  strLength  ));      // Allocate memory for the string and read the data      char     *  buffer     =     new     char  [  strLength     +     1  ];     // +1 for the null-terminator      file  .  read  (  buffer       strLength  );      // Null-terminate the string      buffer  [  strLength  ]     =     ''  ;      // Convert the buffer to a string      str     =     buffer  ;      // Print file data      cout      < <     'File Data: '      < <     str  ;      delete  []     buffer  ;      file  .  close  ();      return     0  ;   }   


Вихід

 File Data: Welcome to GeeksForGeeks  

Інші файлові операції

Ми також можемо виконувати більше операцій для маніпулювання файлом із нашої програми C++. деякі з поширених файлових операцій:

  • Програма C++ для видалення файлу
  • Додавання рядка в існуючий файл
  • Копіювати один файл в інший
Створіть вікторину