Pobieranie macierzy z pliku (tablica dwuwymiarowa).

0

Witam wszystkich,
Mam problem z pobraniem z pliku macierzy w języku c++. liczby dowolne, również ujemne. Problem polega na tym, że pobieram stringi liniami, a muszę je przekonwertować na typ double. Tak chciałbym by wyglądała struktura pliku:

X:X:X:X
X:X:X:X
X:X:X:X
X:X:X:X

Przy czym macierz z założenia jest kwadratowa, X - dowolne liczby, także ujemne. Rozmiar dowolny(ja liczę linie, to wystarczy, bo macierz jest kwadratowa z zalozenia).

Chciałbym dane z pliku wpisać do tablicy dwuwymiarowej kwadratowej typ double. Będę bardzo wdzięczny za pomoc.
Oto fragment kodu: (nieschludny, bo przerabiałem go wielokrotnie, więc proszę nie krytykować)

PS. czytałem, że można użyć atof();

            string buffor;   
            int linie = 0; 
        
            ifstream in;
            
            in.open("temp.txt");
            if(!in.is_open())
                 {
                    int a=MessageBox(HWND_DESKTOP,"Sprawdz, czy plik o podanej nazwie istnieje.","Blad otwarcia pliku!",MB_OKCANCEL);
                    exit(1);
                 }
            while (!in.eof())
                {
                     getline(in, buffor);
                     linie++;
                }
            string tab1[linie];
             
                in.clear(in.rdstate() & ~(ios::failbit | ios::eofbit));
                in.seekg(0, ios_base::beg );
             
            for (int i=0; i<linie; i++)
             {
                 getline(in, tab1[i]);
             }
             for (int i=0; i<linie; i++)
             {
                 cout << tab1[i] << endl;
             }
             
             double tab2[linie][linie];
             
             for(int i=0; i<linie; i++)
             {
                     int k=0;
                     for(int j=0; j<(2*linie-1); j++)
                     {
                    
                        if(tab1[i][j]!=':')
                             {

                               tab2[i][k] = atof(tab1[i][j]);
                               k = k+1;


                             }     
                             
                     }
             }

             for(int i=0; i<linie; i++)
             {
                     for(int j=0; j<linie; j++)
                     {
                      cout << tab2[i][j] << "   ";
                     }
                     cout << endl;
             }

             in.close();
  • otoczyłem kod tagami - msm*
1

przykład w troszkę "starszym stylu":

#include <iostream>
#include <vector>
#include <sstream>
#include <iterator>
#include <fstream>
#include <algorithm>

using namespace std;

typedef vector<double> d_vector;
typedef vector<d_vector> d_matrix;

struct PrintMatrix {
    void operator()(const d_vector &v)
    {
        copy(v.begin(), v.end(), ostream_iterator<double>(cout, " "));
        cout << "\r\n";
    }
};

struct LineString {
    string str;
    operator double() const
    {
        stringstream ss(str);
        double tmp;
        ss >> tmp;
        return tmp;
    }
};


istream & operator>>(istream &is, LineString &line)
{
    getline(is, line.str, ':');
    return is;
}


int main()
{
    string line;
    d_matrix matrix;

    ifstream file("jakis_tam_pliczek");

    if(!file.is_open())
    {
        cerr << "Blad otwarcia pliku.";
        return EXIT_FAILURE;
    }

    while(getline(file, line, '\n'))
    {
        stringstream ss(line);
        d_vector dv((istream_iterator<LineString>(ss)),
                    (istream_iterator<LineString>(  )));
        matrix.push_back(dv);
    }
    file.close();
    for_each(matrix.begin(), matrix.end(), PrintMatrix());

    return EXIT_SUCCESS;
}
0

Bardzo dziękuję, działa super. Przerobie to pod własny kod. [PIWO]

1 użytkowników online, w tym zalogowanych: 0, gości: 1