Лаб. работа “Потоки ввода/вывода и работа с файлами”
Цель работы
Освоить чтение данных из файла с помощью потоков ввода (std::ifstream / QTextStream) и их последующий парсинг для инициализации переменных в приложении. Разработать программу, считывающую параметры сетевого подключения из структурированного текстового файла.
Теоретические сведения
Потоки ввода/вывода C++
| Класс | Заголовок | Назначение |
|---|---|---|
std::ifstream |
<fstream> |
Чтение из файла |
std::ofstream |
<fstream> |
Запись в файл |
std::fstream |
<fstream> |
Чтение и запись |
std::stringstream |
<sstream> |
Работа со строкой как с потоком |
Чтение из файла (std::ifstream)
Построчный парсинг
Запись в файл (std::ofstream)
Строковые потоки (std::stringstream)
Форматирование вывода
Работа с каталогами
Задание для выполнения
Разработать программу, которая считывает параметры для сетевого подключения из структурированного текстового файла и выполняет операции с файлами журнала.
Требования к программе
Создать файл конфигурации
config.txt(в каталоге проекта) в форматеключ=значение:# Конфигурация сетевого подключения server_ip=192.168.1.100 server_port=8080 protocol=TCP timeout=5000 max_retries=3 username=admin log_file=connection.logРеализовать класс
ConnectionConfig:- закрытые поля:
serverIp,protocol,username,logFile(string),serverPort,timeout,maxRetries(int) - метод
loadFromFile(const string& filename)— чтение и парсинг файла конфигурации. Пропуск пустых строк и строк-комментариев (начинающихся с#). При отсутствии файла — генерировать исключениеstd::runtime_error. - метод
saveToFile(const string& filename)— запись текущей конфигурации в файл - метод
display()— форматированный вывод всех параметров - геттеры и сеттеры для всех полей
- закрытые поля:
Реализовать класс
ConnectionLogger:- закрытое поле: путь к файлу журнала (
string) - метод
log(const string& level, const string& message)— запись в формате[ГГГГ-ММ-ДД ЧЧ:ММ:СС] [УРОВЕНЬ] сообщениев файл (режим дозаписи) - метод
readLog()— чтение и вывод всего файла журнала - метод
clearLog()— очистка файла журнала - метод
searchLog(const string& keyword)— поиск строк, содержащих ключевое слово
- закрытое поле: путь к файлу журнала (
Реализовать класс
NetworkSimulator:- использует
ConnectionConfigиConnectionLogger - метод
connect()— имитация подключения: записывает в журнал этапы (DNS-резолвинг, TCP handshake, аутентификация, подключение) - метод
sendData(const string& data)— имитация отправки: записывает данные и размер в журнал - метод
disconnect()— имитация отключения
- использует
В функции
main():- Загрузить конфигурацию из файла
- Вывести загруженные параметры
- Создать логгер и симулятор
- Выполнить подключение, отправку данных, отключение
- Вывести содержимое журнала
- Выполнить поиск по журналу
Пример ожидаемого вывода
=== Загруженная конфигурация ===
Сервер: 192.168.1.100:8080
Протокол: TCP
Таймаут: 5000 мс
Повторы: 3
Пользователь: admin
Журнал: connection.log
=== Имитация подключения ===
[DNS] Резолвинг 192.168.1.100... OK
[TCP] Handshake... OK
[AUTH] Аутентификация пользователя admin... OK
[CONNECT] Подключение установлено
=== Отправка данных ===
[SEND] Отправлено 15 байт: Hello, Server!
=== Содержимое журнала ===
[2025-09-01 14:30:00] [INFO] DNS-резолвинг: 192.168.1.100
[2025-09-01 14:30:00] [INFO] TCP handshake завершён
[2025-09-01 14:30:01] [INFO] Аутентификация: admin
[2025-09-01 14:30:01] [INFO] Подключение установлено
[2025-09-01 14:30:01] [INFO] Отправка данных: Hello, Server! (15 байт)
[2025-09-01 14:30:02] [INFO] Отключение
=== Поиск по журналу (ключевое слово: "admin") ===
[2025-09-01 14:30:01] [INFO] Аутентификация: admin
Индивидуальные задания
Вариант 1. Конфигурация почтового клиента
Файл: mail_config.txt (формат ключ=значение):
# Конфигурация почтового клиента
smtp_server=smtp.example.com
smtp_port=587
pop3_server=pop.example.com
pop3_port=995
email=user@example.com
password=secret123
signature=С уважением, Администратор
Классы: MailConfig (поля: smtpServer, pop3Server, email, password, signature, smtpPort, pop3Port; методы: loadFromFile(), saveToFile(), display()), MailLogger (методы: log(), readLog(), searchLog()), MailSimulator (методы: connect(), sendMail(), receiveMail(), disconnect() — имитация с записью в журнал). Меню: 1. Загрузить конфигурацию, 2. Показать параметры, 3. Имитация отправки письма, 4. Содержимое журнала, 5. Поиск по журналу, 0. Выход.
Вариант 2. Учёт лицензий ПО
Файл: licenses.txt (формат ключ=значение):
# Реестр лицензий
software=Network Monitor
license_key=XXXX-YYYY-ZZZZ
type=enterprise
expiry_date=2026-12-31
user=admin
max_seats=10
Классы: LicenseConfig (поля: software, licenseKey, type, expiryDate, user, maxSeats; методы: loadFromFile(), saveToFile(), display()), LicenseLogger (методы: log(), readLog(), searchLog()), LicenseSimulator (методы: activate(), checkExpiry(), validateKey(), deactivate() — имитация с записью в журнал). Меню: 1. Загрузить конфигурацию, 2. Показать параметры, 3. Активировать лицензию, 4. Проверить срок действия, 5. Содержимое журнала, 0. Выход.
Вариант 3. Конфигурация FTP-клиента
Файл: ftp_config.txt — формат ключ=значение: host, port, username, password, remote_dir, local_dir, mode (active/passive), timeout. Классы: FTPConfig (loadFromFile/saveToFile/display), FTPLogger (log/readLog/searchLog), FTPSimulator (connect/upload/download/list). Меню: загрузить конфиг, показать, имитация операций, журнал, поиск по журналу.
Вариант 4. Конфигурация базы данных
Файл: db_config.txt — формат ключ=значение: db_host, db_port, db_name, username, password, pool_size, timeout. Классы: DBConfig (loadFromFile/saveToFile/display), DBLogger (log/readLog/searchLog), DBSimulator (connect/query/disconnect). Меню: загрузить конфиг, показать, имитация запросов, журнал, поиск по журналу.
Вариант 5. Конфигурация VPN-подключения
Файл: vpn_config.txt — формат ключ=значение: server, port, protocol, username, password, dns, kill_switch. Классы: VPNConfig (loadFromFile/saveToFile/display), VPNLogger (log/readLog/searchLog), VPNSimulator (connect/tunnel/disconnect). Меню: загрузить конфиг, показать, имитация подключения, журнал, поиск по журналу.
Вариант 6. Журнал веб-сервера (анализ access.log)
Файл: access.log — формат: IP метод URL код_ответа размер timestamp. Классы: LogParser (parseFromFile/filterByCode), LogAnalyzer (getStats/searchByKeyword), LogExporter (saveToFile). Меню: загрузить лог, показать все записи, фильтр по коду ответа, статистика, поиск, экспорт.
Вариант 7. Конфигурация DHCP-сервера
Файл: dhcp_config.txt — формат ключ=значение: subnet, mask, range_start, range_end, gateway, dns, lease_time. Классы: DHCPConfig (loadFromFile/saveToFile/display), DHCPLogger (log/readLog/searchLog), DHCPSimulator (assign/revoke/list). Меню: загрузить конфиг, показать, имитация выдачи адресов, журнал, поиск по журналу.
Вариант 8. Таблица маршрутизации из файла
Файл: routes.txt — формат: сеть маска шлюз интерфейс метрика (одна запись на строку). Классы: RouteTable (loadFromFile/saveToFile/findRoute), RouteLogger (log/readLog/searchLog), RouteSimulator (addRoute/removeRoute/routePacket). Меню: загрузить, показать, найти маршрут, имитация маршрутизации, журнал.
Вариант 9. Конфигурация SSH-подключений
Файл: ssh_hosts.txt — формат: alias host port user keyfile (одна запись на строку, возможно несколько хостов). Классы: SSHConfig (loadFromFile/saveToFile/display), SSHLogger (log/readLog/searchLog), SSHSimulator (connect/execute/disconnect). Меню: загрузить конфиг, показать, имитация выполнения команд, журнал, поиск по журналу.
Вариант 10. Учёт DNS-записей
Файл: dns_records.txt — формат: домен тип значение TTL (одна запись на строку). Классы: DNSRecords (loadFromFile/saveToFile/lookup), DNSLogger (log/readLog/searchLog), DNSSimulator (resolve/add/remove). Меню: загрузить, показать все записи, поиск записи по домену, имитация DNS-разрешения, журнал.
Вариант 11. Конфигурация балансировщика нагрузки
Файл: lb_config.txt — формат ключ=значение: listen_port, algorithm (round_robin/least_conn), backend1, backend2, health_check_interval. Классы: LBConfig (loadFromFile/saveToFile/display), LBLogger (log/readLog/searchLog), LBSimulator (distribute/check). Меню: загрузить конфиг, показать, имитация балансировки запросов, журнал, поиск по журналу.
Вариант 12. Журнал ошибок приложения
Файл: error_log.txt — формат: timestamp уровень модуль сообщение (одна запись на строку). Классы: ErrorLog (loadFromFile/appendEntry/searchByKeyword), ErrorStats (countByLevel/countByModule), ErrorExporter (saveToFile). Меню: загрузить лог, показать все записи, статистика по уровням/модулям, поиск, экспорт.
Вариант 13. Конфигурация IoT-устройств
Файл: devices.txt — формат: id тип ip порт интервал_опроса (одно устройство на строку). Классы: DeviceConfig (loadFromFile/saveToFile/display), DeviceLogger (log/readLog/searchLog), DeviceSimulator (readData/configure). Меню: загрузить конфиг, показать, имитация опроса устройств, журнал, поиск по журналу.
Вариант 14. Учёт пользователей чата
Файл: chat_users.txt — формат: логин ip порт статус время_подключения (один пользователь на строку). Классы: UserManager (loadFromFile/saveToFile/findUser), ChatLogger (log/readLog/searchLog), ChatSimulator (login/sendMessage/logout). Меню: загрузить, показать, поиск пользователя, имитация чата, журнал.
Вариант 15. Биллинг интернет-трафика
Файл: traffic.txt — формат: ip объём_МБ дата тариф (одна запись на строку). Классы: TrafficManager (loadFromFile/appendEntry/getStats), BillingLogger (log/readLog/searchLog), BillingSimulator (calculateCost). Меню: загрузить, показать все записи, рассчитать стоимость, статистика, поиск по журналу.
Вариант 16. Конфигурация контейнеров
Файл: containers.txt — формат: имя образ порт статус память (один контейнер на строку). Классы: ContainerConfig (loadFromFile/saveToFile/display), ContainerLogger (log/readLog/searchLog), ContainerSimulator (start/stop/restart). Меню: загрузить конфиг, показать, имитация управления контейнерами, журнал, поиск по журналу.
Вариант 17. Правила фаервола из файла
Файл: firewall_rules.txt — формат: правило ip_источника ip_назначения порт действие протокол (одно правило на строку). Классы: FirewallRules (loadFromFile/saveToFile/evaluatePacket), FWLogger (log/readLog/searchLog), FWSimulator (allowPacket/denyPacket). Меню: загрузить, показать все правила, проверить пакет, имитация фильтрации, журнал.
Вариант 18. Конфигурация SNMP-мониторинга
Файл: snmp_config.txt — формат ключ=значение: community, version, hosts (ip:port через запятую), poll_interval, mibs. Классы: SNMPConfig (loadFromFile/saveToFile/display), SNMPLogger (log/readLog/searchLog), SNMPSimulator (poll/alert). Меню: загрузить конфиг, показать, имитация опроса узлов, журнал, поиск по журналу.
Вариант 19. Учёт лицензий ПО
Файл: licenses.txt — формат: ПО ключ тип дата_истечения пользователь (одна лицензия на строку). Классы: LicenseManager (loadFromFile/saveToFile/checkLicense), LicenseLogger (log/readLog/searchLog), LicenseSimulator (activate/verify). Меню: загрузить, показать все лицензии, проверить лицензию, имитация активации, журнал.
Вариант 20. Конфигурация вебхуков
Файл: webhooks.txt — формат: имя URL метод событие заголовки (один вебхук на строку). Классы: WebhookConfig (loadFromFile/saveToFile/display), WebhookLogger (log/readLog/searchLog), WebhookSimulator (trigger/verify). Меню: загрузить конфиг, показать, имитация вызова вебхука, журнал, поиск по журналу.
Порядок выполнения
- Создать проект C++ в Qt Creator (CMake).
- Создать файл
config.txtв каталоге проекта. - Реализовать класс
ConnectionConfigс чтением и записью конфигурации. - Реализовать класс
ConnectionLoggerс работой с файлом журнала. - Реализовать класс
NetworkSimulator, объединяющий конфигурацию и логирование. - В
main()загрузить конфигурацию, выполнить все операции, вывести результаты. - Проверить: изменить параметры в
config.txt, перезапустить программу, убедиться в корректном чтении. - Скомпилировать, запустить, сохранить скриншоты.
Контрольные вопросы
- Какие классы для работы с файлами предоставляет стандартная библиотека C++?
- Чем отличаются режимы открытия файла
ios::in,ios::out,ios::app,ios::trunc? - Как проверить, что файл успешно открыт? Что произойдёт при попытке чтения несуществующего файла?
- Чем отличается
getline(file, line)от оператора>>? - Для чего используется
std::stringstream? Приведите пример из вашей программы. - Как работает функция
substr()и методfind()классаstring? - Как получить текущую дату и время для записи в журнал?
- Что такое манипуляторы вывода (
setw,left,setfill)? Как они используются? - Какие преимущества даёт хранение конфигурации в файле по сравнению с жёстким кодированием в программе?
Содержание отчёта
- Тема, цель и задание лабораторной работы.
- Содержимое файла
config.txt. - Текст программы с комментариями.
- Скриншоты: вывод загруженной конфигурации, имитация подключения, содержимое журнала.
- Ответы на контрольные вопросы.