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