Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.02.2025, 21:17   #1
noka
Новичок
Джуниор
 
Регистрация: 07.02.2025
Сообщений: 4
По умолчанию считывание данных из файла в вектор структур

я написала код, но где-то ошибка, он не работает корректно
Код:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <fstream> // Для работы с файлами

using namespace std;

struct Patient {
    vector<int> features;  // Признаки пациента
    string result;         // Результат лечения
};

int main() {
    vector<Patient> patients;  // Вектор для хранения пациентов

    // Открытие файла для чтения
    ifstream inputFile("data.txt");
    if (!inputFile) {
        cerr << "Не удалось открыть файл!" << endl;
        return 1; // Завершаем программу, если файл не удалось открыть
    }

    string line;

    // Чтение файла построчно
    while (getline(inputFile, line)) {
        Patient patient;
        stringstream ss(line);  // Используем stringstream для разбора строки

        int feature;
        // Чтение числовых признаков (пока не дойдем до последнего значения)
        while (ss >> feature) {
            patient.features.push_back(feature);
        }

        // Извлекаем результат лечения (последнее значение в строке)
        patient.result = to_string(patient.features.back());
        patient.features.pop_back();  // Убираем последнее число, которое является результатом

        // Добавляем пациента в вектор
        patients.push_back(patient);
    }

    // Закрытие файла
    inputFile.close();

    // Выводим данные, чтобы проверить
    for (const Patient& patient : patients) {
        cout << "Features: ";
        for (int feature : patient.features) {
            cout << feature << " ";
        }
        cout << "| Result: " << patient.result << endl;
    }

    return 0; }
данные в файле к примеру такие
30 40 mmm
24 50 aaaa
60 40 vvvv

Последний раз редактировалось BDA; 08.02.2025 в 20:35.
noka вне форума Ответить с цитированием
Старый 07.02.2025, 23:12   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Как вы собрались mmm читать как число?
p51x вне форума Ответить с цитированием
Старый 08.02.2025, 09:26   #3
noka
Новичок
Джуниор
 
Регистрация: 07.02.2025
Сообщений: 4
По умолчанию

struct Patient {
vector<int> features; // Признаки пациента
string result; // Результат лечения
};
mmm типа string в структуре. Вы можете подсказать, как решить эту проблему?
noka вне форума Ответить с цитированием
Старый 08.02.2025, 12:58   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Цитата:
Сообщение от noka Посмотреть сообщение
mmm типа string в структуре.
я вижу

Цитата:
Сообщение от noka Посмотреть сообщение
Вы можете подсказать, как решить эту проблему?
Читать не только цифры, но и строку.
p51x вне форума Ответить с цитированием
Старый 08.02.2025, 14:44   #5
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 209
По умолчанию

Чтение файла идёт бесконечно.
Я вставил в текст вот такое условие выхода
Код:
        if ( (line.length() == 0) or (inputFile.eof()) )
        {
            break;
        }
Потом, чтение из потока "while (ss >> feature) {" идёт пока есть в потоке целые числа,
и "// Извлекаем результат лечения (последнее значение в строке)
patient.result = to_string(patient.features.back()); "
но ведь последнее значение - строка, поэтому это не работает.
Если вы точно знаете формат данных в строке, то можно просто
Код:
        ss >> feature;
        patient.features.push_back(feature) ;

        ss >> feature;
        patient.features.push_back(feature) ;

        ss >> patient.result;
        patients.push_back(patient);
а если точно не знаете количество элементов в строке, то надо делать разбор строки при помощи getline.
https://en.cppreference.com/w/cpp/io...stream/getline
где в качестве разделителя пробел и таб.

Вот исправленная программа
Код:
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <fstream> // Для работы с файлами

using namespace std;

struct Patient {
    vector<int> features; // Признаки пациента
    string result; // Результат лечения
};

int main() {
    vector<Patient> patients; // Вектор для хранения пациентов

    // Открытие файла для чтения
    ifstream inputFile("data.txt");
    if (!inputFile) {
        cerr << "Не удалось открыть файл!" << endl;
        return 1; // Завершаем программу, если файл не удалось открыть
    }

    string line;

    // Чтение файла построчно
    while (getline(inputFile, line)) {
        if ( (line.length() == 0) or (inputFile.eof()) )
        {
            break;
        }
        Patient patient;
        stringstream ss(line); // Используем stringstream для разбора строки

        int feature;
        // Чтение числовых признаков (пока не дойдем до последнего значения)
        //while (ss >> feature) {
        //    patient.features.push_back(feature) ;
        //}
        ss >> feature;
        patient.features.push_back(feature) ;
        ss >> feature;
        patient.features.push_back(feature) ;

        // Извлекаем результат лечения (последнее значение в строке)
        //patient.result = to_string(patient.features.back());
        //patient.features.pop_back(); // Убираем последнее число, которое является результатом
        ss >> patient.result;

        // Добавляем пациента в вектор
        patients.push_back(patient);
    }

    // Закрытие файла
    inputFile.close();

    // Выводим данные, чтобы проверить
    for (const Patient& patient : patients) {
        cout << "Features: ";
        for (int feature : patient.features) {
            cout << feature << " ";
        }
        cout << "| Result: " << patient.result << endl;
    }

    return 0; 
}
Результат работы:
Код:
Features: 30 40 | Result: mmm
Features: 24 50 | Result: aaaa
Features: 60 40 | Result: vvvv
DeepFlake вне форума Ответить с цитированием
Старый 08.02.2025, 17:44   #6
noka
Новичок
Джуниор
 
Регистрация: 07.02.2025
Сообщений: 4
По умолчанию

Я очень благодарна Вам за то, что Вы так подробно мне все объяснили, но у меня опять некорректно сработала программа
Features: 0 0 | Result:
Features: 24 50 | Result: aaaa

C:\Users\Nora\source\repos\iz faila schitat danie\Debug\iz faila schitat danie.exe (process 15456) exited with code 0.
To automatically close the console when debugging stops, enable Tools->Options->Debugging->Automatically close the console when debugging stops.
Press any key to close this window . . .
noka вне форума Ответить с цитированием
Старый 08.02.2025, 17:50   #7
noka
Новичок
Джуниор
 
Регистрация: 07.02.2025
Сообщений: 4
По умолчанию

Может проблема в том, что я использую Visual Studio 2019 ?
noka вне форума Ответить с цитированием
Старый 08.02.2025, 20:51   #8
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 209
По умолчанию

Отладка программ - дело непростое. Покажите вашу программу и файл с данными, лучше их в виде прикрепления к сообщению (кнопка Загрузить файлы).

Программу можно пройти под отладчиком, установите точку останова на функции main, запустите программу в режиме отладка, проходите пошагово (step), при этом смотрите значения переменных.

Можно ещё применять отладочный вывод, то есть выводить значения переменных в нужных местах, например после "while (getline(inputFile, line)) {" добавьте строку
Код:
std::cerr << line << std::endl;
и будете видеть что считала программа из файла.

Если вам не нравится Visual Studio, то есть Red Panda C++
https://sourceforge.net/projects/red...pp/files/v3.2/

https://sourceforge.net/projects/redpanda-cpp/
DeepFlake вне форума Ответить с цитированием
Старый 08.02.2025, 20:55   #9
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 209
По умолчанию

Результат лечения - это всегда только одно слово? или может быть несколько слов?
Если несколько, то надо формат файла данных сделать другим, например в качестве разделителя использовать двоеточие (и программу переделать). Сейчас программа считывает только одно слово.

А пустые строки могут быть?

Последний раз редактировалось DeepFlake; 08.02.2025 в 20:57.
DeepFlake вне форума Ответить с цитированием
Старый 08.02.2025, 21:57   #10
DeepFlake
Форумчанин
 
Регистрация: 16.05.2024
Сообщений: 209
По умолчанию

Вот программа из сообщения 5 в прикреплении. Там ещё файл с данными.
Вложения
Тип файла: zip vect.zip (1.3 Кб, 2 просмотров)
DeepFlake вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Считывание данных из файла, С++ archerix Помощь студентам 17 19.12.2019 04:09
C++ Считывание данных из файла bylbyl9tor Помощь студентам 1 11.04.2019 14:26
Считывание данных с файла LittleStudent Помощь студентам 0 29.05.2011 12:08
Считывание данных из файла inret Общие вопросы Delphi 4 18.11.2007 18:03
Считывание данных из файла PAVEL315 Общие вопросы Delphi 26 17.12.2006 00:53