токенизатор конвертировать строку в плавающий - PullRequest
0 голосов
/ 30 октября 2011

Я хотел бы преобразовать строку в число с плавающей точкой в ​​C ++. в настоящее время пытаюсь использовать atof. Любые предложения приветствуются.

они приходят как: 2.22,2.33,2.44,2.55

в конце я бы хотел, чтобы временный массив выглядел так: Temp [4] = {2.22,2.33,2.44,2.55}

getline (myfile,line);
t_tokenizer tok(line, sep);
float temp[4];
int counter = 0;

for (t_tokenizer::iterator beg = tok.begin(); beg != tok.end(); ++beg)
{
    temp[counter] = std::atof(* beg);
    counter++;
}

Ответы [ 3 ]

2 голосов
/ 30 октября 2011

Я бы просто использовал stringstream:

#include <sstream>

template <class T> 
bool fromString(T &t, const std::string &s, 
                std::ios_base& (*f)(std::ios_base&) = std::dec)) {
  std::istringstream iss(s);
  return !(iss >> f >> t).fail();
}
1 голос
/ 30 октября 2011

Вы всегда можете использовать буст lexical_cast или эквивалент без буста:

string strarr[] = {"1.1", "2.2", "3.3", "4.4"};
vector<string> strvec(strarr, end(strarr));

vector<float> floatvec;

for (auto i = strvec.begin(); i != strvec.end(); ++i) {
    stringstream s(*i);
    float tmp;
    s >> tmp;
    floatvec.push_back(tmp);
}

for (auto i = floatvec.begin(); i != floatvec.end(); ++i)
    cout << *i << endl;
0 голосов
/ 30 октября 2011

Ваш подход хорош, но будьте осторожны с граничными условиями:

getline (myfile,line);
t_tokenizer tok(line, sep);
float temp[4];
int counter = 0;

for (t_tokenizer::iterator beg = tok.begin(); beg != tok.end() && counter < 4; ++beg)
{
    temp[counter] = std::atof(* beg);
    ++counter;
}
...