Я пытаюсь прочитать в файле векторов объектов, хранящих векторы объектов, следующим образом:
(метка) (корзина) 🙁 значение) (корзина) 🙁 значение) и т. д.
лайк:
-1 5: 0,015748 6: 0,0472441 7: 0,0393701 8: 0,00787402 12: 0,0314961 13: 0,0944882 14: 0,110236 15: 0,0472441 20: 0,023622 21: 0,102362 22: 0,110236 28: 0,015748 29: 0,228346 30: 0,125984
Как вы можете видеть, он сохраняется без бункеров со значением 0.
Я попытался прочитать их с помощью следующего кода:
int bin;
int label;
float value;
string small_char; -> change to char small_char to fix the problem
if(readFile.is_open())
while(!readFile.eof()) {
getline(readFile, line);
istringstream stm(line);
stm >> label;
cout << label << endl;
while(stm) {
stm >> bin;
stm >> small_char;
stm >> value;
cout << bin << small_char << value << endl;
}
cout << "Press ENTER to continue...";
cin.ignore( numeric_limits<streamsize>::max(), '\n' );
}
}
Но по неизвестной причине метка читается правильно, первая корзина также имеет значение, но следующие секции вообще не читаются.
Вывод приведенной выше строки примера:
-1
5:0.015748
5:0.015748
Press ENTER to continue
То же самое происходит для всех следующих строк.
Я использую Visual Studio 10, если это все равно имеет значение.
Испытав это самому, кажется, что вы используете не правильные типы (а также правильные условия зацикливания).
Моя тестовая программа:
#include <sstream>
#include <iostream>
int main()
{
std::istringstream is("-1 5:0.015748 6:0.0472441 7:0.0393701 8:0.00787402 12:0.0314961 13:0.0944882 14:0.110236 15:0.0472441 20:0.023622 21:0.102362 22:0.110236 28:0.015748 29:0.228346 30:0.125984");
int label;
int bin;
char small;
double value;
is >> label;
std::cout << label << '\n';
while (is >> bin >> small >> value)
{
std::cout << bin << small << value << '\n';
}
}
Выход из этой программы:
-1 5: 0,015748 6: 0,0472441 7: 0,0393701 8: 0,00787402 12: 0,0314961 13: 0,0944882 14: 0,110236 15: 0,0472441 20: 0,023622 21: 0,102362 22: 0,110236 28: 0,015748 29: 0,228346 30: 0,125984
Поэтому убедитесь, что типы переменных правильные, и измените цикл, чтобы не получать двойные последние строки.
Других решений пока нет …