Ниже у меня есть строка с именем 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;
}
Ваша проблема в том, что вы добавляете символы к значению с плавающей точкой, вы не можете конвертировать его таким образом. Что вы на самом деле делаете, так это складывает шестнадцатеричные значения символов, составляющих ваше число, если вы посмотрите в таблицу 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;
}
Подумайте об использовании stringstream
а также getline(..., ',')
:
string line;
string strPart;
string floatPart;
istringstream isline(line);
getline(isline, strPart, ',');
getline(isline, floatPart, ',');
istringstream isfloat(floatPart);
float f;
isfloat >> f;
Конечно, это требует много проверок на возможные ошибки, но должно работать.