Istringstream не «гуляет» через линию

Я пытаюсь прочитать в файле векторов объектов, хранящих векторы объектов, следующим образом:

(метка) (корзина) 🙁 значение) (корзина) 🙁 значение) и т. д.

лайк:

-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, если это все равно имеет значение.

0

Решение

Испытав это самому, кажется, что вы используете не правильные типы (а также правильные условия зацикливания).

Моя тестовая программа:

#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

Поэтому убедитесь, что типы переменных правильные, и измените цикл, чтобы не получать двойные последние строки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]