boost — чтение данных в двойной массив с переполнением стека

вот моя проблема. У меня есть некоторые двумерные данные с изменяющейся размерностью, которые я хочу прочитать в 2d-массиве двойников. Кроме того, в некоторых местах есть не число в файле, а «NaN», которые я хочу заменить на ноль. До сих пор мой код работал, но мне удалось прочитать только целые числа. Может быть, вы могли бы помочь мне прочитать это как двойники?

Вот что я получил до сих пор:

void READER(char filepath [], int target [129][128])
{

//----------------------------       header double & int

int rowA = 0;
int colA = 0;

std::string line;
std::string  x;std::cout << "reading file: " << filepath << "\n";
std::cout << std::endl;

std::ifstream fileIN;
fileIN.open(filepath);

if (!fileIN.good())
std::cerr << "READING ERROR IN FILE: " << filepath << std::endl;while (fileIN.good())
{
while (getline(fileIN, line))
{
std::istringstream   streamA(line);
colA = 0;
while (streamA >> x)
{

boost::algorithm::replace_all(x, "NaN", "0");

boost::algorithm::replace_all(x, ",", "");            //. rein// std::cout << string_to_int(x) << std::endl;

target [rowA][colA]   =  string_to_int(x);
colA++;

}
rowA++;
if(rowA%5 ==0)
{
std::cout << "*";
}
}
}std::cout << " done." <<std::endl;}

это записывает файлы в «цель». Строка функции для int выглядит следующим образом:

int string_to_int (const std::string& s)
{
std::istringstream i(s);
int x;
if(!(i >> x))
return 0;
return x;

}

здесь вы найдете несколько примеров данных:
введите описание изображения здесь

1

Решение

«Именно, это то, что я думал о том, чтобы делать с линией boost::algorithm::replace_all(x, ",", ""); заменив, на.«

Используйте следующую функцию для преобразования в любой тип, скажем double : —

template <typename T>
T StringToNumber ( const std::string &Text )
{
std::istringstream ss(Text);
T result;
return ss >> result ? result : 0;
}

Звоните используя:

boost::algorithm::replace_all(x, ",", ".");         // Change , to .
std::cout << StringToNumber<double>(x) << std::endl;

Или же

Вы можете просто использовать boost::lexical_cast

std::cout<<boost::lexical_cast<double>( x )<<std::endl;

Убедитесь, что у вас есть double 2D массив

1

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

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