Как вы преобразуете массив строк в массив с плавающей точкой в ​​C ++? - PullRequest
2 голосов
/ 11 ноября 2011

По сути, я практически ничего не знаю о C ++, и я только кратко программировал на Visual Basic.

Я хочу, чтобы набор чисел из CSV-файла был сохранен как массив float. Вот некоторый код:

string stropenprice[702];   
float openprice[702];
int x=0;
ifstream myfile ("open.csv");
if (myfile.is_open())
{
  while ( myfile.good() )
  {
    x=x+1;
    getline (myfile,stropenprice[x]);
    openprice[x] = atof(stropenprice[x]);
    ...
  }
  ...
}

В любом случае он говорит:

ошибка C2664: 'atof': невозможно преобразовать параметр 1 из 'std :: string' в 'const char *'

1 Ответ

4 голосов
/ 11 ноября 2011

Ну, вы должны сказать atof(stropenprice[x].c_str()), потому что atof() работает только со строками в стиле C, а не std::string объектами, но этого недостаточно.Вы все еще должны разбить строку на части, разделенные запятыми.find() и substr() могут быть хорошим началом (например, см. Здесь ), хотя, возможно, более общая функция токенизации была бы более элегантной.

Вот функция токенизатора, которую я украл изгде-то так давно я не помню, поэтому извиняюсь за плагиат:

std::vector<std::string> tokenize(const std::string & str, const std::string & delimiters)
{
  std::vector<std::string> tokens;

  // Skip delimiters at beginning.
  std::string::size_type lastPos = str.find_first_not_of(delimiters, 0);
  // Find first "non-delimiter".
  std::string::size_type pos     = str.find_first_of(delimiters, lastPos);

  while (std::string::npos != pos || std::string::npos != lastPos)
  {
    // Found a token, add it to the vector.
    tokens.push_back(str.substr(lastPos, pos - lastPos));
    // Skip delimiters.  Note the "not_of"
    lastPos = str.find_first_not_of(delimiters, pos);
    // Find next "non-delimiter"
    pos = str.find_first_of(delimiters, lastPos);
  }

  return tokens;
}

Использование: std::vector<std::string> v = tokenize(line, ","); Теперь используйте std::atof() (или std::strtod()) на каждой строке в векторе.


Вот предложение, просто чтобы дать вам некоторое представление о том, как обычно пишется такой код на C ++:

#include <string>
#include <fstream>
#include <vector>
#include <cstdlib>

// ...

std::vector<double> v;

std::ifstream infile("thefile.txt");
std::string line;

while (std::getline(infile, line))
{
  v.push_back(std::strtod(line.c_str(), NULL));  // or std::atof(line.c_str())
}

// we ended up reading v.size() lines
...