Skip to content

Практическая работа №7

Работа с файлами в C++: Консольный ввод-вывод

Section titled “Работа с файлами в C++: Консольный ввод-вывод”

Цель работы: Научиться использовать стандартные средства C++ для работы с файлами (чтение, запись, обработка) в консольных приложениях, используя классы из библиотеки <fstream>.

Основные теоретические положения

Section titled “Основные теоретические положения”

Для работы с файлами в C++ используется библиотека <fstream>, которая предоставляет три основных класса:

КлассНазначениеРежим работы
ofstreamВывод в файл (запись)Создает файл для записи. Если файл существует, его содержимое по умолчанию стирается.
ifstreamВвод из файла (чтение)Открывает существующий файл для чтения.
fstreamВвод и вывод (чтение и запись)Открывает файл для одновременного чтения и записи.

2. Открытие и закрытие файла

Section titled “2. Открытие и закрытие файла”

Для открытия файла используется конструктор класса или метод open().

#include <fstream>
#include <iostream>
void file_example() {
// 1. Создание объекта для записи
std::ofstream fout("output.txt");
// 2. Проверка успешности открытия
if (fout.is_open()) {
fout << "Это первая строка.\n";
fout << "Это вторая строка.\n";
// 3. Закрытие файла
fout.close();
std::cout << "Данные записаны в output.txt\n";
} else {
std::cerr << "Не удалось открыть файл для записи!\n";
}
// 4. Создание объекта для чтения
std::ifstream fin("output.txt");
std::string line;
if (fin.is_open()) {
std::cout << "Чтение из output.txt:\n";
// Чтение построчно
while (getline(fin, line)) {
std::cout << line << "\n";
}
fin.close();
} else {
std::cerr << "Не удалось открыть файл для чтения!\n";
}
}

3. Режимы открытия файла (Flags)

Section titled “3. Режимы открытия файла (Flags)”

При открытии файла можно указать дополнительные режимы с помощью оператора побитового ИЛИ (|):

ФлагОписание
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";
fout.close();

4. Работа с бинарными файлами

Section titled “4. Работа с бинарными файлами”

Бинарные файлы используются для хранения данных в том виде, в каком они хранятся в памяти, без преобразования в текстовое представление. Это обеспечивает более высокую скорость ввода-вывода и точное сохранение данных (например, чисел с плавающей точкой).

Для работы с бинарными файлами необходимо использовать флаг std::ios::binary при открытии файла. Основные операции выполняются с помощью методов write() и read().

Запись в бинарный файл (write) Метод write записывает блок данных из памяти в файл.

// Синтаксис: stream.write(const char* s, streamsize n);
int number = 12345;
std::ofstream fout("data.bin", std::ios::out | std::ios::binary);
fout.write(reinterpret_cast<const char*>(&number), sizeof(number));
fout.close();
  • reinterpret_cast<const char*>(&number): Преобразует адрес переменной в указатель на char, так как write работает с сырыми байтами.
  • sizeof(number): Указывает количество байтов, которое нужно записать.

Чтение из бинарного файла (read) Метод read считывает блок данных из файла в память.

// Синтаксис: stream.read(char* s, streamsize n);
int read_number;
std::ifstream fin("data.bin", std::ios::in | std::ios::binary);
fin.read(reinterpret_cast<char*>(&read_number), sizeof(read_number));
fin.close();
// Теперь read_number содержит значение 12345

5. Работа со структурами в бинарном режиме

Section titled “5. Работа со структурами в бинарном режиме”

Бинарный режим особенно удобен для работы со структурами, поскольку позволяет записывать и считывать их целиком одним блоком, сохраняя исходное представление данных в памяти.

Пример записи структуры:

struct Student {
int id;
char name[50];
float avg_grade;
};
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));
fout.close();
}

Пример чтения структуры:

Student s;
std::ifstream fin("students.dat", std::ios::in | std::ios::binary);
// Чтение всей структуры целиком
fin.read(reinterpret_cast<char*>(&s), sizeof(Student));
fin.close();
// Теперь s содержит данные из файла

6. Произвольный доступ к файлу (seekg, seekp)

Section titled “6. Произвольный доступ к файлу (seekg, seekp)”

По умолчанию чтение и запись происходят последовательно. Для доступа к данным в произвольном месте файла используются функции-члены:

  • seekg(): Перемещает указатель чтения (get pointer).
  • seekp(): Перемещает указатель записи (put pointer).

Обе функции принимают два аргумента:

  1. Смещение (offset): Количество байтов для смещения.
  2. Начальная позиция (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();

7. Проверка состояния потока

Section titled “7. Проверка состояния потока”

Крайне важно проверять состояние потока после операций ввода-вывода:

МетодОписание
is_open()Возвращает true, если файл успешно открыт.
good()Возвращает true, если ошибок не было.
eof()Возвращает true, если достигнут конец файла.
fail()Возвращает true, если произошла ошибка (например, ошибка чтения).

Компиляция и запуск программы

Section titled “Компиляция и запуск программы”
Terminal window
g++ *имя_файла*.cpp -o *название_файла_для_компиляции*
./*название_скомпилированного_файла*

Для каждого задания необходимо:

  1. Составить схему алгоритма программы;
  2. Написать программу на языке программирования C++;
  3. Предусмотреть обработку ошибок открытия/записи/чтения файлов;
  4. Продемонстрировать работу программы на тестовых данных, создав необходимые входные файлы.

Задания для выполнения

Section titled “Задания для выполнения”

Выбор варианта: Номер варианта соответствует порядковому номеру студента в списке группы. Если количество студентов превышает 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, прочитайте и выведите на экран данные о первой стране (с начала файла).

  1. Какие три основных класса используются в C++ для работы с файлами и в чем их различие?
  2. Для чего используется метод is_open()? Какие еще методы проверки состояния потока вы знаете?
  3. В чем разница между режимами открытия std::ios::out и std::ios::app?
  4. Как можно прочитать файл построчно в C++? Приведите пример функции.
  5. Объясните, что такое бинарный режим работы с файлами (std::ios::binary) и когда его следует использовать.
  6. Как происходит обработка ошибок при работе с файлами (например, если файл не найден)?
  7. Как считывать структурированные данные (например, целые числа или слова) из файла, используя оператор >>?

Рекомендуемая литература

Section titled “Рекомендуемая литература”
  1. C++ File Handling (fstream). cplusplus.com. https://www.cplusplus.com/doc/tutorial/files/
  2. C++ File I/O. GeeksforGeeks. https://www.geeksforgeeks.org/cpp-file-io/
  3. Стивен Прата. Язык программирования C++. Лекции и упражнения. 6-е изд. – М.: ООО “И.Д. Вильямс”, 2012. – 1248 с.
  4. Бьерн Страуструп. Язык программирования C++. 4-е изд. – М.: Бином-Пресс, 2011. – 1136 с.