Расщепление строки на 2 вектора. Проблемы с преобразованием строки в тип float

Ниже у меня есть строка с именем line, которая исходит из файла. Строка имеет запятые, чтобы отделить ее, где первая часть переходит в вектор строки, а вторая — в вектор с плавающей точкой. Ничего после этого не используется.

Первая часть выходит как «текст», что правильно. Но второй показывает «248», в то время как он должен сказать «1,234»

Мне нужна помощь, чтобы преобразовать это правильно. Любая помощь будет принята с благодарностью, спасибо.

Я очень новичок в программировании. Извините за любой ужасный стиль.

#include <iostream>
#include <string>
#include <vector>
using namespace std;

int main ()
{
string line ("test,1.234,4.3245,5.231");
string comma (",");
size_t found;
size_t found2;
string round1;
float round2;
vector<string> vector1;
vector<float> vector2;

// Finds locations of first 2 commas
found = line.find(comma);
if (found!=string::npos)

found2 = line.find(comma,found+1);
if (found2!=string::npos)
//Puts data before first comma to round1 (string type)
for (int a = 0; a < found; a++){
round1 = round1 += line[a];
}

//Puts data after first comma and before second comma to round2 (float type)
for (int b = found+1; b < found2; b++){
round2 = round2 += line[b];
}//Puts data to vectors
vector1.push_back(round1);
vector2.push_back(round2);cout << vector1[0] << endl << vector2[0] << endl;return 0;
}

2

Решение

Ваша проблема в том, что вы добавляете символы к значению с плавающей точкой, вы не можете конвертировать его таким образом. Что вы на самом деле делаете, так это складывает шестнадцатеричные значения символов, составляющих ваше число, если вы посмотрите в таблицу ASCII, вы заметите 1 = 49,. = 46, 2 = 50, 3 = 51, 4 = 52 , Если вы сложите эти 5, вы получите 248. Кроме того, даже если это не так в этом случае:

round2 = round2 += line[b];

должно быть:

round2 += line[b];

Причина в том, что оператор + = будет эквивалентен:

round2 = round2 + line[b];

так что нет смысла добавлять лишние round2 = перед ней.

Чтобы сделать это правильно, используйте строковые потоки, например, так:

#include <string>
#include <sstream>

int main()
{
float f;
std::stringstream floatStream;
floatStream << "123.4";
floatStream >> f;

return 0;
}
1

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

Подумайте об использовании stringstream а также getline(..., ',') :

string line;
string strPart;
string floatPart;
istringstream isline(line);
getline(isline, strPart, ',');
getline(isline, floatPart, ',');
istringstream isfloat(floatPart);
float f;
isfloat >> f;

Конечно, это требует много проверок на возможные ошибки, но должно работать.

0

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