/
nik2703
/
boundary_approx
Обзор
Документация
Войти
/
nik2703
/
boundary_approx
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
data_loader.cpp
127 строк
5 KB
nik2703
upload files
07 окт 2025, 17:29
07 окт 2025, 17:29
32b847a
Код
Авторство
О чём код?
#include "data_loader.h" #include <fstream> #include <sstream> #include <iostream> #include <stdexcept> #include <iomanip> bool DataLoader::loadFromFile(const std::string& filename) { std::ifstream file(filename); if (!file.is_open()) { std::cerr << "Error: Could not open file '" << filename << "'." << std::endl; return false; } auto isCommentOrEmpty = [](const std::string& line) -> bool { if (line.empty()) return true; // Пропускаем строки, начинающиеся с '#', даже если есть пробелы в начале for (char c : line) { if (c == '#') return true; if (!std::isspace(static_cast<unsigned char>(c))) break; } return false; }; std::string line; bool in_data_section = false; while (std::getline(file, line)) { // --- ГЛОБАЛЬНОЕ ПРАВИЛО: Пропускаем комментарии и пустые строки ВЕЗДЕ --- if (isCommentOrEmpty(line)) { continue; } std::istringstream iss(line); std::string keyword; if (!(iss >> keyword)) { // Очень странная строка, но пропустим continue; } if (keyword == "DIMENSION") { if (!(iss >> dimension_)) { throw std::runtime_error("Invalid DIMENSION value in file."); } if (dimension_ == 0) { throw std::runtime_error("Dimension must be greater than zero."); } } else if (keyword == "POINTS") { size_t point_count; if (!(iss >> point_count)) { throw std::runtime_error("Invalid POINTS value in file."); } data_points_.reserve(point_count); } else if (keyword == "DATA") { in_data_section = true; } else if (keyword == "END") { break; } else if (in_data_section) { // --- Это строка с данными --- // Возвращаем первое слово (которое уже прочитано как keyword) обратно в поток iss.clear(); iss.str(keyword + " " + iss.str()); // Восстанавливаем всю строку DataPoint point(dimension_); for (size_t i = 0; i < dimension_; ++i) { if (!(iss >> point.coords[i])) { throw std::runtime_error("Failed to read coordinate " + std::to_string(i) + " for a data point."); } } if (!(iss >> point.cluster_id)) { throw std::runtime_error("Failed to read cluster_id for a data point."); } data_points_.push_back(std::move(point)); } else { // Неизвестная команда в заголовке (например, "VERSION") std::cerr << "Warning: Unknown keyword '" << keyword << "' in header. Skipping line." << std::endl; } } file.close(); if (data_points_.empty()) { std::cerr << "Warning: No data points were loaded." << std::endl; } else if (data_points_[0].coords.size() != dimension_) { throw std::runtime_error("Inconsistent dimension in data points."); } std::cout << "Successfully loaded " << data_points_.size() << " points of dimension " << dimension_ << " from '" << filename << "'." << std::endl; return true; } bool DataLoader::saveBoundaryModel(const std::vector<BoundarySegment>& model, const std::string& filename) { std::ofstream file(filename); if (!file.is_open()) { std::cerr << "Ошибка: Не удалось открыть файл '" << filename << "' для записи." << std::endl; return false; } file << "# Версия формата\n"; file << "VERSION 1.0\n\n"; file << "# Общее количество сегментов границ\n"; file << "SEGMENTS_TOTAL " << model.size() << "\n\n"; for (size_t seg_id = 0; seg_id < model.size(); ++seg_id) { const auto& seg = model[seg_id]; file << "SEGMENT " << seg_id << "\n"; file << "CLUSTERS " << seg.cluster_i << " " << seg.cluster_j << "\n"; file << "APPROX_AXIS " << seg.approx_axis << "\n"; file << "POLY_DEGREE " << seg.poly_degree << "\n"; file << "COEFFICIENTS"; for (float coeff : seg.coefficients) { file << " " << std::fixed << std::setprecision(6) << coeff; } file << "\n"; file << "END_SEGMENT\n\n"; } file << "# Конец файла\n"; file << "END\n"; file.close(); std::cout << "Модель границ успешно сохранена в '" << filename << "'." << std::endl; return true; }