Обробка файлів у 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++#includeusing 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++#includeusing 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++#includeusing 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++#includeusing 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++#includeusing 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 ; }
ВихідБінарний файл
Читання з бінарного файлу
Так само, як ми відкриваємо файл у двійковому режимі, щоб записати дані, щоб прочитати дані з двійкового файлу, ми повинні відкрити файл у режимі читання за допомогою ios::in .
Синтаксис:
C++C++fstream fileInstance ( 'fileName.bin' ios :: in | ios :: binary );#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++ для видалення файлу
- Додавання рядка в існуючий файл
- Копіювати один файл в інший
Бінарний файл