Question

here is my problem. i have some two dimensional data with changing dimensionality, that i want to read into an 2d-array of doubles. Furthermore, there are at some points not number in the file but "NaN"s, that i want to be replaced by a zero. I made my code working so far, but i only managed to read integers. Maybe you could help me out to read it as doubles?

Here is what i got so far:

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;


}

this writes the files into 'target'. The function string to int looks the following:

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

}

here you find some example data: enter image description here

Was it helpful?

Solution

"exactly, thats what i thought about doing with the line boost::algorithm::replace_all(x, ",", ""); by replacing , by ."

Use following function to convert to any type, say double :-

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

Call using :

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

Or

you can simply use boost::lexical_cast

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

Make sure you have a double 2D array

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top