Как проанализировать текст из файла в две разные переменные

У меня есть текстовый файл, вот он:

a 0.240741
; 0.037037
k 0.0925926
s 0.222222
l 0.0925926
d 0.314815
ЏЌд|.–&Фsнcп—#

Мне нужно назначить первую часть текста (символы и их частоту) неупорядоченным map, а остальной текст(ЏЌд|.–&Фsнcп—#) в строковую переменную. Как это сделать?

У меня есть структура:

struct data_maps {
    unordered_map<char, double> char_prob; 
    unordered_map<char, string> char_haffcode; 
    string haffcode_all; 
    string ascii_char; 
};

Код, который должен анализировать файл и присваивать текст переменным.

data_maps parsing_file(string text)
{
    data_maps data;
    ifstream file(text);

    char ch;
    double prob;
    streampos currentPosition;
    if (file.is_open()) {
        while (file >> ch >> prob)
        {
            data.char_prob[ch] = prob;
            streampos currentPosition = file.tellg();
        }

        
        file.seekg(currentPosition);

        string temp;
                while (getline(file,temp)) {
                     data.ascii_char += temp;
                }
    }
    else
        cerr << "Error:file have not opened.";
    return data;
}

Когда я выполняю это:

data_maps maps;
maps = parsing_file("D:\\HC_test\\testing.cmph");
for (auto pair : maps.char_prob)
{
    cout << pair.first << " " << pair.second << endl;
}   
cout << maps.ascii_char;

у меня есть этот вывод:

a 0.240741
; 0.037037
k 0.0925926
s 0.222222
l 0.0925926
d 0.314815

Шаг за шагом вы заставляете нас делать домашнее задание... это что-то вроде 5-го вопроса сегодня?

Pepijn Kramer 29.04.2024 20:40

нет, я не делаю домашнее задание. Я боролся с алгоритмом Хаффмана, и это так. Я не смог найти ни одного примера или теории, как это сделать правильно, поэтому спросил здесь. Кстати, в чем твоя проблема? давай, будь немного добрее

Pavlo Osip 02.05.2024 11:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

while (file >> ch >> prob) читает из файла до тех пор, пока не дойдете до последней строки, где не удается извлечь двойное значение. Восстановиться после этого сложно, потому что поток находится в состоянии ошибки, и вы уже использовали символ, но на самом деле вам нужна вся строка1.

Вместо этого прочитайте строки из файла. Я представляю только приблизительный план, а остальное оставляю вам (на самом деле в вашем коде не так уж много):

std::string line;
while(getline(file,line) {

   //attempt to read a character and a float:
   std::stringstream ss{line};
   if (ss >> ch >> prob) {
        // it was successful ... use ch and prob
   } else {
        // it was not.. use line
   }
}

Чтение строк из файла всегда завершается успешно, пока вы не достигнете конца файла. Извлечение символа и двойного значения не удается только для последней строки, где вы хотите использовать полный line.


1 Я думаю, что ваш код правильно восстанавливает позицию в файле, но не сбрасывает правильно состояние потока, и по этой причине не удается прочитать последнюю строку.

Другие вопросы по теме