У меня есть текстовый файл, вот он:
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
нет, я не делаю домашнее задание. Я боролся с алгоритмом Хаффмана, и это так. Я не смог найти ни одного примера или теории, как это сделать правильно, поэтому спросил здесь. Кстати, в чем твоя проблема? давай, будь немного добрее
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 Я думаю, что ваш код правильно восстанавливает позицию в файле, но не сбрасывает правильно состояние потока, и по этой причине не удается прочитать последнюю строку.
Шаг за шагом вы заставляете нас делать домашнее задание... это что-то вроде 5-го вопроса сегодня?