Доброго времени суток!
Помогите пожалуйста разобраться что я делаю не так.
Пытаюсь применить уже привычный метод записи на диск, но не в отношении структуры ил класса, но в отношении "голого" динамического массива.
Получается код:
//Создание динамиеского массива функцией(одномерного)
#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(), которая возвратила размер одного элемента, в то время как если подставить туда массив обычный, она вернула бы размер всего массива)и в итоге программа пишет размеры массива, его первый элемент, и далее следует свободное место.
Или же я что то не так сделал.
Писать и считывать массив в цикле не стоит предлагать, тут уже дело принципа разобраться с этим,заставив работать, или же понять почему это не возможно
.
С чем и нижайше прошу помочь.