Цель работы: Научиться использовать стандартные средства C++ для работы с файлами (чтение, запись, обработка) в консольных приложениях, используя классы из библиотеки <fstream>.
Для работы с файлами в C++ используется библиотека <fstream>, которая предоставляет три основных класса:
Класс Назначение Режим работы ofstreamВывод в файл (запись) Создает файл для записи. Если файл существует, его содержимое по умолчанию стирается . ifstreamВвод из файла (чтение) Открывает существующий файл для чтения. fstreamВвод и вывод (чтение и запись) Открывает файл для одновременного чтения и записи.
Для открытия файла используется конструктор класса или метод open().
// 1. Создание объекта для записи
std::ofstream fout ( " output.txt " );
// 2. Проверка успешности открытия
fout << " Это первая строка. \n " ;
fout << " Это вторая строка. \n " ;
std::cout << " Данные записаны в output.txt \n " ;
std::cerr << " Не удалось открыть файл для записи! \n " ;
// 4. Создание объекта для чтения
std::ifstream fin ( " output.txt " );
std::cout << " Чтение из output.txt: \n " ;
while ( getline (fin, line)) {
std::cout << line << " \n " ;
std::cerr << " Не удалось открыть файл для чтения! \n " ;
При открытии файла можно указать дополнительные режимы с помощью оператора побитового ИЛИ (|):
Флаг Описание std::ios::inОткрытие для чтения (по умолчанию для ifstream). std::ios::outОткрытие для записи (по умолчанию для ofstream). std::ios::appВсе операции записи выполняются в конец файла (добавление). std::ios::truncСтирает содержимое файла, если он существует (по умолчанию для ofstream). std::ios::binaryОткрытие файла в бинарном режиме.
Пример добавления в конец файла:
std::ofstream fout ( " log.txt " , std::ios::app);
fout << " Новая запись в логе. \n " ;
Бинарные файлы используются для хранения данных в том виде, в каком они хранятся в памяти, без преобразования в текстовое представление. Это обеспечивает более высокую скорость ввода-вывода и точное сохранение данных (например, чисел с плавающей точкой).
Для работы с бинарными файлами необходимо использовать флаг std::ios::binary при открытии файла. Основные операции выполняются с помощью методов write() и read().
Запись в бинарный файл (write)
Метод write записывает блок данных из памяти в файл.
// Синтаксис: stream.write(const char* s, streamsize n);
std::ofstream fout ( " data.bin " , std::ios::out | std::ios::binary);
fout . write ( reinterpret_cast <const char*> ( & number), sizeof (number));
reinterpret_cast<const char*>(&number): Преобразует адрес переменной в указатель на char, так как write работает с сырыми байтами.
sizeof(number): Указывает количество байтов, которое нужно записать.
Чтение из бинарного файла (read)
Метод read считывает блок данных из файла в память.
// Синтаксис: stream.read(char* s, streamsize n);
std::ifstream fin ( " data.bin " , std::ios::in | std::ios::binary);
fin . read ( reinterpret_cast <char*> ( & read_number), sizeof (read_number));
// Теперь read_number содержит значение 12345
Бинарный режим особенно удобен для работы со структурами, поскольку позволяет записывать и считывать их целиком одним блоком, сохраняя исходное представление данных в памяти.
Пример записи структуры:
void write_student ( const Student & s ) {
std::ofstream fout ( " students.dat " , std::ios::out | std::ios::binary);
// Запись всей структуры целиком
fout . write ( reinterpret_cast <const char*> ( & s), sizeof (Student));
Пример чтения структуры:
std::ifstream fin ( " students.dat " , std::ios::in | std::ios::binary);
// Чтение всей структуры целиком
fin . read ( reinterpret_cast <char*> ( & s), sizeof (Student));
// Теперь s содержит данные из файла
По умолчанию чтение и запись происходят последовательно. Для доступа к данным в произвольном месте файла используются функции-члены:
seekg(): Перемещает указатель чтения (get pointer).
seekp(): Перемещает указатель записи (put pointer).
Обе функции принимают два аргумента:
Смещение (offset): Количество байтов для смещения.
Начальная позиция (direction): Точка отсчета для смещения.
Точка отсчета Флаг Описание Начало файла std::ios::begСмещение от начала файла (по умолчанию). Текущая позиция std::ios::curСмещение от текущей позиции. Конец файла std::ios::endСмещение от конца файла.
Пример произвольного доступа:
// Переместить указатель чтения на 10-й байт от начала файла
fin . seekg ( 10 , std::ios::beg);
// Переместить указатель записи на 5 байт назад от текущей позиции
fout . seekp ( - 5 , std::ios::cur);
// Получить текущую позицию указателя чтения/записи
long pos_g = fin . tellg ();
long pos_p = fout . tellp ();
Крайне важно проверять состояние потока после операций ввода-вывода:
Метод Описание is_open()Возвращает true, если файл успешно открыт. good()Возвращает true, если ошибок не было. eof()Возвращает true, если достигнут конец файла. fail()Возвращает true, если произошла ошибка (например, ошибка чтения).
g++ * имя_файла * .cpp -o * название_файла_для_компиляции *
./*название_скомпилированного_файла*
Для каждого задания необходимо:
Составить схему алгоритма программы;
Написать программу на языке программирования C++;
Предусмотреть обработку ошибок открытия/записи/чтения файлов;
Продемонстрировать работу программы на тестовых данных, создав необходимые входные файлы.
Выбор варианта: Номер варианта соответствует порядковому номеру студента в списке группы. Если количество студентов превышает 15, варианты повторяются по кругу (например, 16-й студент выполняет Вариант 1, 17-й - Вариант 2 и т.д.).
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает 5 строк и записывает их в файл lines.txt, каждую с новой строки. 2 Текст (Обработка) Прочитайте файл numbers.txt (целые числа через пробел). Найдите и запишите в файл output_sum.txt сумму всех положительных чисел. 3 Бинарный I/O Запишите 10 случайных целых чисел в бинарный файл random.bin. 4 Структуры (Бинарный I/O) Создайте структуру Product (название, цена, количество). Запросите данные для 3 продуктов и запишите их в бинарный файл products.dat. 5 Произвольный доступ Прочитайте файл products.dat (из задачи 4). Используя seekg, прочитайте и выведите на экран данные о втором продукте.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая записывает в файл alphabet.txt все заглавные буквы английского алфавита (от A до Z) через пробел. 2 Текст (Обработка) Прочитайте файл text.txt. Подсчитайте количество слов, начинающихся с гласной буквы, и запишите результат в vowel_count.txt. 3 Бинарный I/O Запишите 5 чисел с плавающей точкой в бинарный файл floats.bin. 4 Структуры (Бинарный I/O) Создайте структуру Employee (ФИО, должность, зарплата). Запросите данные для 4 сотрудников и запишите их в бинарный файл employees.dat. 5 Произвольный доступ Прочитайте файл employees.dat (из задачи 4). Используя seekp, обновите зарплату для первого сотрудника, установив ее равной 75000.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает у пользователя целое число N и записывает в файл sequence.txt последовательность чисел от 1 до N, по одному числу в строке. 2 Текст (Обработка) Прочитайте файл log.txt. Создайте новый файл errors.txt, куда запишите только те строки, которые содержат слово “ERROR” (без учета регистра). 3 Бинарный I/O Создайте программу, которая считывает содержимое файла random.bin (из Варианта 1) и выводит его на экран. 4 Структуры (Бинарный I/O) Создайте структуру Point (x, y, z - float). Запишите 5 случайных точек в бинарный файл points.dat. 5 Произвольный доступ Прочитайте файл points.dat (из задачи 4). Используя seekg, прочитайте и выведите на экран координаты последней точки.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая считывает содержимое файла source.txt и записывает его в файл copy.txt, заменяя все пробелы на символы подчеркивания (_). 2 Текст (Обработка) Прочитайте файл text.txt. Подсчитайте количество строк, которые являются палиндромами, и запишите результат в palindromes.txt. 3 Бинарный I/O Запишите 8 логических значений (bool) в бинарный файл bools.bin. 4 Структуры (Бинарный I/O) Создайте структуру Book (название, автор, год). Запросите данные для 3 книг и запишите их в бинарный файл books.dat. 5 Произвольный доступ Прочитайте файл books.dat (из задачи 4). Используя seekp, обновите год издания для второй книги, установив его равным 2024.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает название файла и его содержимое, и записывает содержимое в указанный файл. 2 Текст (Обработка) Прочитайте файл data.txt (целые числа, по одному в строке). Отсортируйте числа и запишите отсортированный список в файл sorted_data.txt. 3 Бинарный I/O Прочитайте файл bools.bin (из Варианта 4) и выведите на экран, сколько из записанных значений были true. 4 Структуры (Бинарный I/O) Создайте структуру Car (марка, год, цена). Запишите 5 автомобилей в бинарный файл cars.dat. 5 Произвольный доступ Прочитайте файл cars.dat (из задачи 4). Используя seekg, найдите и выведите на экран данные о первом автомобиле.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает 5 чисел с плавающей точкой и записывает их в файл floats.txt с точностью до двух знаков после запятой. 2 Текст (Обработка) Прочитайте файл students.txt (ФИО, средний балл). Найдите студента с минимальным средним баллом и запишите его ФИО в файл worst_student.txt. 3 Бинарный I/O Запишите массив из 100 целых чисел в бинарный файл array.bin. 4 Структуры (Бинарный I/O) Создайте структуру Movie (название, жанр, рейтинг). Запишите 3 фильма в бинарный файл movies.dat. 5 Произвольный доступ Прочитайте файл movies.dat (из задачи 4). Используя seekp, обновите рейтинг для последнего фильма, установив его равным 9.5.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает строку и добавляет ее в конец файла history.log с текущей меткой времени. 2 Текст (Обработка) Прочитайте файл text.txt. Создайте новый файл no_vowels.txt, куда запишите содержимое файла, удалив все гласные буквы. 3 Бинарный I/O Прочитайте файл array.bin (из Варианта 6) и выведите на экран сумму всех чисел. 4 Структуры (Бинарный I/O) Создайте структуру Circle (радиус, цвет). Запишите 5 кругов в бинарный файл circles.dat. 5 Произвольный доступ Прочитайте файл circles.dat (из задачи 4). Используя seekg, прочитайте и выведите на экран данные о третьем круге.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая записывает в файл primes.txt первые 10 простых чисел. 2 Текст (Обработка) Прочитайте файл text.txt. Создайте новый файл unique_words.txt, куда запишите все уникальные слова из исходного файла, отсортированные по алфавиту. 3 Бинарный I/O Запишите 5 целых чисел в бинарный файл data.bin и затем прочитайте их обратно, используя read(). 4 Структуры (Бинарный I/O) Создайте структуру Address (город, улица, дом). Запишите 3 адреса в бинарный файл addresses.dat. 5 Произвольный доступ Прочитайте файл addresses.dat (из задачи 4). Используя seekp, обновите город в первом адресе на “Санкт-Петербург”.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает у пользователя 5 слов и записывает их в файл words.txt, каждое слово в отдельной строке. 2 Текст (Обработка) Прочитайте файл grades.txt (ФИО, оценка). Увеличьте оценку каждого студента на 1 балл (но не более 5) и запишите обновленные данные в файл new_grades.txt. 3 Бинарный I/O Запишите 10 чисел с плавающей точкой в бинарный файл temps.bin. 4 Структуры (Бинарный I/O) Создайте структуру Planet (название, масса, радиус). Запишите 4 планеты в бинарный файл planets.dat. 5 Произвольный доступ Прочитайте файл planets.dat (из задачи 4). Используя seekg, прочитайте и выведите на экран данные о планете, которая находится предпоследней в файле.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая считывает содержимое файла source.txt и записывает его в файл reversed.txt в обратном порядке (последняя строка становится первой). 2 Текст (Обработка) Прочитайте файл text.txt. Удалите все пустые строки и запишите результат в файл no_empty_lines.txt. 3 Бинарный I/O Прочитайте файл temps.bin (из Варианта 9) и найдите минимальное и максимальное значения. 4 Структуры (Бинарный I/O) Создайте структуру Animal (имя, вид, возраст). Запишите 5 животных в бинарный файл animals.dat. 5 Произвольный доступ Прочитайте файл animals.dat (из задачи 4). Используя seekp, обновите возраст для третьего животного.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает у пользователя 3 строки и добавляет их в конец файла notes.txt. 2 Текст (Обработка) Прочитайте файл matrix.txt (квадратная матрица). Найдите сумму элементов побочной диагонали и запишите ее в файл anti_diag_sum.txt. 3 Бинарный I/O Запишите 20 случайных чисел типа short в бинарный файл shorts.bin. 4 Структуры (Бинарный I/O) Создайте структуру Recipe (название, время_приготовления, сложность). Запишите 3 рецепта в бинарный файл recipes.dat. 5 Произвольный доступ Прочитайте файл recipes.dat (из задачи 4). Используя seekg, прочитайте и выведите на экран данные о первом рецепте.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает у пользователя символ и записывает его в файл symbol.txt 100 раз подряд. 2 Текст (Обработка) Прочитайте файл text.txt. Подсчитайте частоту встречаемости каждого символа и запишите результат в файл char_freq.txt. 3 Бинарный I/O Прочитайте файл shorts.bin (из Варианта 11) и найдите среднее арифметическое всех чисел. 4 Структуры (Бинарный I/O) Создайте структуру Song (название, исполнитель, длительность). Запишите 5 песен в бинарный файл songs.dat. 5 Произвольный доступ Прочитайте файл songs.dat (из задачи 4). Используя seekp, обновите длительность для третьей песни.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая записывает в файл numbers.txt числа от 1 до 100, разделенные запятыми. 2 Текст (Обработка) Прочитайте файл text.txt. Создайте новый файл no_comments.txt, удалив все строки, начинающиеся с символа #. 3 Бинарный I/O Запишите массив из 50 чисел типа float в бинарный файл data_float.bin. 4 Структуры (Бинарный I/O) Создайте структуру Customer (ID, ФИО, баланс). Запишите 3 клиентов в бинарный файл customers.dat. 5 Произвольный доступ Прочитайте файл customers.dat (из задачи 4). Используя seekg, прочитайте и выведите на экран данные о клиенте с ID=2 (вторая запись).
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая считывает содержимое файла source.txt и записывает его в файл destination.txt, переводя все символы в верхний регистр. 2 Текст (Обработка) Прочитайте файл sales.csv (Товар;Количество). Найдите товар с максимальным количеством продаж и запишите его название в файл best_seller.txt. 3 Бинарный I/O Прочитайте файл data_float.bin (из Варианта 13). Найдите количество чисел, которые больше 10.0. 4 Структуры (Бинарный I/O) Создайте структуру Vector (x, y, z - int). Запишите 5 векторов в бинарный файл vectors.dat. 5 Произвольный доступ Прочитайте файл vectors.dat (из задачи 4). Используя seekp, обнулите все компоненты (x, y, z) для первого вектора.
№ Тип задачи Описание задачи 1 Текст (Запись) Создайте программу, которая запрашивает у пользователя путь к файлу и считывает его содержимое, выводя его на экран. 2 Текст (Обработка) Прочитайте файл text.txt. Создайте новый файл reversed_words.txt, инвертировав порядок букв в каждом слове. 3 Бинарный I/O Запишите 5 целых чисел в бинарный файл final.bin. 4 Структуры (Бинарный I/O) Создайте структуру Country (название, столица, население). Запишите 3 страны в бинарный файл countries.dat. 5 Произвольный доступ Прочитайте файл countries.dat (из задачи 4). Используя seekg и std::ios::end, прочитайте и выведите на экран данные о первой стране (с начала файла).
Какие три основных класса используются в C++ для работы с файлами и в чем их различие?
Для чего используется метод is_open()? Какие еще методы проверки состояния потока вы знаете?
В чем разница между режимами открытия std::ios::out и std::ios::app?
Как можно прочитать файл построчно в C++? Приведите пример функции.
Объясните, что такое бинарный режим работы с файлами (std::ios::binary) и когда его следует использовать.
Как происходит обработка ошибок при работе с файлами (например, если файл не найден)?
Как считывать структурированные данные (например, целые числа или слова) из файла, используя оператор >>?
C++ File Handling (fstream) . cplusplus.com . https://www.cplusplus.com/doc/tutorial/files/
C++ File I/O . GeeksforGeeks . https://www.geeksforgeeks.org/cpp-file-io/
Стивен Прата. Язык программирования C++. Лекции и упражнения. 6-е изд. – М.: ООО “И.Д. Вильямс”, 2012. – 1248 с.
Бьерн Страуструп. Язык программирования C++. 4-е изд. – М.: Бином-Пресс, 2011. – 1136 с.