Сохранение динамического массива на диск(неясная проблема)
От: Paul4936  
Дата: 10.09.11 23:24
Оценка:
Доброго времени суток!
Помогите пожалуйста разобраться что я делаю не так.
Пытаюсь применить уже привычный метод записи на диск, но не в отношении структуры ил класса, но в отношении "голого" динамического массива.
Получается код:

//Создание динамиеского массива функцией(одномерного)
#include <fstream>
#include <iostream>

//#define WIDTH 8
//#define LENGHT 5
#define TYPE double
using namespace std;

void main()
{
    long long i,j;
    long long WIDTH,LENGHT;
    cout <<"WIDTH:";
    cin >> WIDTH;
    cout <<endl;
    cout <<"LENGHT:";
    cin >> LENGHT;
    cout <<endl;
    
    TYPE** data;
    data = new TYPE*[LENGHT];
    for(i=0;i<LENGHT;i++)
    {
        data[i]= new TYPE[WIDTH];
    }
    for (i=0;i<LENGHT;i++)
    {
        for (j=0;j<WIDTH;j++)
            {
                data[i][j]=i/(j+1);
            };
    };

    std::ofstream outfile("array1.bin",ofstream::binary|ios::out|ios::trunc );
    outfile.write(reinterpret_cast<char*>(&LENGHT),(sizeof LENGHT));
    outfile.write(reinterpret_cast<char*>(&WIDTH),(sizeof WIDTH));
    outfile.write(reinterpret_cast<const char*>(data),sizeof(TYPE)*WIDTH*LENGHT);
    outfile.close();
    cout <<"Size(Arr):("<< sizeof(TYPE)*WIDTH*LENGHT<<")bytes"<<endl;
    cin >>i;
}

Он компилируется, и даже как минимум сохраняет в файл длину и ширину моего массива.
Далее пытаюсь считать из файла:

#include <fstream>
#include <iostream>

//#define WIDTH 8
//#define LENGHT 5
#define TYPE double
using namespace std;

void main()
{

    long long i,j;
    long long WIDTH,LENGHT;


    std::ifstream fromfile("array1.bin",ios::binary);                    
    fromfile.read(reinterpret_cast<char*>(&LENGHT),sizeof LENGHT);
    fromfile.read(reinterpret_cast<char*>(&WIDTH),sizeof WIDTH);
        
    TYPE** data;
    data = new TYPE*[LENGHT];
    for(i=0;i<LENGHT;i++)
    {
        data[i]= new TYPE[WIDTH];
    }
    //    
    //                                                                            /**/
    //fromfile.read(reinterpret_cast<char*>(&data),sizeof(TYPE)*WIDTH*LENGHT);
                                            /**Коли раскоментить это, то программа 
                                            *не работает(при отладке тычет носом в new.cpp)
                                            *как бы говоря мне "Unhandled exception at
                                            *0x000007fefd76a49d in hdd to matrix1.exe: 
                                            *Microsoft C++ exception: std::bad_alloc 
                                            *at memory location 0x0013faf0.."
                                            *Что вероятно связанно с тем что при отладке 
                                            *нормально не читаются размеры массива.
                                            **/
                                            /**
                                            * В прочем при отладке(F5) они не читаются и 
                                            * если закоментить,однако если запускать исполняемый 
                                            * файл, то все читается верно
                                            ***/
    cout <<"Size(Arr):("<< sizeof(TYPE)*WIDTH*LENGHT<<")bytes"<<endl;        
    fromfile.close();                                                        
    cout <<"WIDTH:";
    cout << WIDTH;
    cout <<endl;
    cout <<"LENGHT:";
    cout << LENGHT;
    cout <<endl;
    

    /*for (i=0;i<LENGHT;i++)   //не возможно в связи с выше указанной проблеммой
    {
        for (j=0;j<WIDTH;j++)
            {
                cout << data[i][j]<<"\/";
            };
        cout <<endl;
    };*/

    
    cin >>i;
}

Тут вообще странно, если запустить нажав F5(отладка) то и длинна с шириной читаются не верно, ежели после этого запустить исполняемый файл, то читается верно, массив же считать не удается(я завернул в комментарии то место и прокомментировал его).
К сожалению дело тут не в Visual Studio (проверял в Code::Blocks +GNU GCC Compiller)
Возможно тут дело в том что при передаче моего массива в итоге передается лишь первый элемент(на это намекает ф-я sizeof(), которая возвратила размер одного элемента, в то время как если подставить туда массив обычный, она вернула бы размер всего массива)и в итоге программа пишет размеры массива, его первый элемент, и далее следует свободное место.
Или же я что то не так сделал.
Писать и считывать массив в цикле не стоит предлагать, тут уже дело принципа разобраться с этим,заставив работать, или же понять почему это не возможно .
С чем и нижайше прошу помочь.
c++ visual c++
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.