Hi im having problems with saving/loading a 3d array from a file. In some cases the values of the loaded datas dont fit the datas from the saved datas. Looks like some values are shifted.
Does C++ have a problem with "huge" multidimensional arrays?
This is the way i try to store/load the level:
void load_level(void) {
char filenamen[1024] = "maps/";
strcat (filenamen,editor_levelname);
FILE *stream;
stream = fopen(filenamen, "r" );
fread( level, sizeof( char ), 256*32*16*16, stream );
fclose( stream );
return;
}
void save_level(void) {
FILE *stream;
char filenamen[1024] = "maps/";
strcat (filenamen,editor_levelname);
stream = fopen(filenamen, "w+t" );
fwrite( level, sizeof( char ), 256*32*16*16, stream );
fclose( stream );
return;
}
Any help?
Thx :]
Problems saving a 3D-Array
You probably want to explicitly specify binary mode with "rb" and "wb". On most *nix systems "w" and "wb" and "wt" are all equivalent, but on some other systems "w" is actually "wt" not "wb".
look how i load data
first i set the array lengths
then in loop i create a varialbe and load to it data then i assign var to table element
for (j = 0; j < pk; j++) {
tmatrixtype KK2;
fread(&KK2,sizeof(KK2),1,f);
Matrixarr[j] = KK2;
}
but first of all you must make sure that you save your 3d array correctly
first i set the array lengths
then in loop i create a varialbe and load to it data then i assign var to table element
for (j = 0; j < pk; j++) {
tmatrixtype KK2;
fread(&KK2,sizeof(KK2),1,f);
Matrixarr[j] = KK2;
}
but first of all you must make sure that you save your 3d array correctly
void __fastcall TachoGLModel::LoadModel(AnsiString filename, bool ProjectTextureHandling)
{
if (FileExists(filename) == false) {
ShowMessage("File does not exists: INVALID MODEL FILENAME: "+filename);
return;
}
USE_COLOR_MAP = false;
int j,n;
int x;
int i;
int liczba;
textpoint * imo2;
FILE* f = fopen(filename.c_str(),"rb");
memset(&header,0,sizeof(TachoGLModelHeader));
fread(&header,sizeof(TachoGLModelHeader),1,f);
int m = header.LENGTH;
VBO_V.set_length(m);
VBO_N.set_length(m);
VBO_T.set_length(m);
//FACES_PICK_COLOR.set_length(10);
//FACES_PICK_COLOR[8][2] = 10.0f;
//VBO_CV=&VBO_V;
//
//VBO_CV->set_length(m);
//VBO_CN=&VBO_N;
//
//VBO_CN->set_length(m);
VBO_CT=&VBO_T;
VBO_CT->set_length(m);
for (j=0; j < m ; j++) {
t3dpoint imo;
fread(&imo,sizeof(imo),1,f);
VBO_V[j] = imo;
}
for (j=0; j < m ; j++) {
t3dpoint imo2;
fread(&imo2,sizeof(imo2),1,f);
VBO_N[j] = imo2;
}
for (j=0; j < m ; j++) {
textpoint imo3;
fread(&imo3,sizeof(imo3),1,f);
VBO_T[j] = imo3;
}
int pk;
fread(&pk,sizeof(pk),1,f); //ilosc scian
VBO_BE.set_length(pk);
Matrixarr.set_length(pk);
Textureindex.set_length(pk);
CMOK = pk;
for (j=0; j < CMOK ; j++) {
int CV;
fread(&CV,sizeof(CV),1,f);
Textureindex[j] = CV;
}
for (j = 0; j < pk; j++) {
tvbofacenfo KK;
fread(&KK,sizeof(KK),1,f);
VBO_BE[j] = KK;
}
for (j = 0; j < pk; j++) {
tmatrixtype KK2;
fread(&KK2,sizeof(KK2),1,f);
Matrixarr[j] = KK2;
}
Matrixarr.set_length(pk);
//for (i = 0; i < Textureindex.Length; i++) Textureindex = 0;
for (i = 0; i < Textures.Length; i++) Textures.ID = 0;
if (FileExists(filename+".texi") == true) {
AnsiString a;
TStringList * s = new TStringList();
if (ProjectTextureHandling == true) {
TStringList * d = new TStringList();
delete d;
}
s->LoadFromFile(filename+".texi");
Textures.set_length(s->Count);
AnsiString me = FCyfra->basedir;//+"OpenGL\\";
s->Text = StringReplace(s->Text,"%",me,TReplaceFlags() << rfReplaceAll);
for (i = 0; i < s->Count; i++) {
// int x = FOUND_IN_TEXTURE_COLLECTION(me+s->Strings);
int x = -1;
if (x < 0) {
//dodaj teksdture do ProjectTextures
}
else {
//jak juz jest to zmieniaj i tak textureindex
}
LoadTexture(me+s->Strings,Textures.pointer,false);
a = LowerCase(s->Strings);
Textures.ID = 0;
if (Pos("noclip",a) > 0) Textures.ID = 2;
if (Pos("nodraw",a) > 0) Textures.ID = 2;
if (Pos("caulk",a) > 0) Textures.ID = 2;
if (Pos("stripe_wht_dot",a) > 0) Textures.ID = 1;
//ShowMessage("HE : "+IntToStr(i));
//ShowMessage
if (Pos("tree",a) > 0) Textures.ID = 1;
//ShowMessage("ALPHA CHANNEL TEX");
}
delete s;
}
if (header.USEN == false)
if (header.USET == false)
{
// ShowMessage("Ich will ");
/* for (j=0; j < m ; j++) {
t3dpoint imoomo;
fread(&imoomo,sizeof(imoomo),1,f);
VBO_C[j] = imoomo;
}
*/
}
fclose(f);
// header.USEN=true;
// header.USET=true;
/*
for (i=0; i < VBO_V.Length; i++) {
VBO_V = (*VBO_C);
}*/
AnsiString colormapfile = ExtractFilePath(filename)+change_filename_ext(filename,"colormap");
if (FileExists( colormapfile ) == true ) {
LOAD_COLORMAP_FILE( colormapfile );
USE_COLOR_MAP = true;
}
//
//CreateCollArrays();
//
//CalcFaceDist();
//
//
//CalculateMinMax();
// CalcCenterPoint();
this->filename = filename;
ModelCanBeUsed = true;
}
[/quote]
do not be so stupid and save file like this
xlen ylen zlen
[x[[y][z]
for x
for y
for z
t3dpoint k;
blockread
table[x][y][z] = k;
it is the easiest way i think maybe not lol :]
This topic is closed to new replies.
Advertisement
Popular Topics
Advertisement