Witam!
Piszę grę która będzie wczytywała dane z pliku binarnego. Wykorzystałem kod z symfoni , przerobiłem do własnych potrzeb jednak mam problem gdyż jak mam przeładowany operator aby odnosić sie do pliku obiekt[][] . Problem polega na tym że elementy od obiekt[0][0] do obiekt.[0][wymiar] są jak gdyby nie zainicjowane w pliku (wywala krzaki ze tak powiem). Poniżej umieszczam kod z symfoni gdyż wystepuje w nim ten sam "bład" .
z gory dziekuje za pomoc.
//***************************************************
// Program z paragrafu 22.19 (str 1138)
//***************************************************
// Sprawdzony na Linuksie, kompilator: GNU gcc version 3.3.3 (SuSE Linux)
// Sprawdzony na Windows XP, kompilator: Microsoft Visual C++ 6.0
#include <iostream>
#include <fstream>
#include <cstdlib> // dla exit()
#include <string>
using namespace std;
////////////////////////////////////////////////////////
class duza_tablica// `1
{
string nazwa_pliku; // nazwa pliku dyskowego
fstream plik;
const int rozmiar;
int * linijka; // linijka w zapasie pamięci
long dlug_linijki;
int nr_obecnego; // nr wiersza nad którym pracujemy
public:
duza_tablica(string nazwa_pliku, int wym, int wypelniacz = 0);
~duza_tablica();
int * operator[](int wiersz);
private:
void error();
};
/*******************************************************/
duza_tablica::duza_tablica(string nazwa, int wym,
int wypelniacz)
: rozmiar(wym), nazwa_pliku(nazwa)// 2 { plik.open(nazwa.c_str(), ios::in | ios::out | ios::binary);//
3
if(!plik)
{
cout << "Blad otwarcia pliku " << nazwa_pliku << endl;
error();
}
linijka = new int[rozmiar];// `4
dlug_linijki = rozmiar * sizeof(int);
nr_obecnego = 0;
}
/*******************************************************/
duza_tablica::~duza_tablica()// `6
{
// skoro koniec, to musimy odesłać na dysk wiersz,
// ktory jest jeszcze w tablicy linijka
if(! plik.seekp(nr_obecnego * dlug_linijki))
{
cout << "Blad pozycjonowania "
"wskaznika pisania\n";
error();
}
// zapisanie tam ---------
if(!plik.write( (char*)linijka , dlug_linijki) )
{
cout << "Blad przy odsylaniu\n";
error();
}
plik.close(); // zamknięcie pliku
delete [] linijka; // zwolnienie rezerwacji
}
//
// przeładowanie operatora []
//
int * duza_tablica::operator[](int nr_wiersza_chcianego)
{// `7
//===========================================
// moze dany fragment tablicy jest pod ręką ?
//===========================================
if(nr_wiersza_chcianego == nr_obecnego)
{
return linijka; // tak, to nic nie trzeba robić !
}
//===============================================
// jesli nie, to najpierw odsyłamy obecny wiersz=
// ==============================================
// obliczenie, gdzie go posłać
if(! plik.seekp(nr_obecnego * dlug_linijki))
{
cout << "Blad pozycjonowania wskaznika pisania\n";
error();
}
// zapisanie tam -------------------------
if(!plik.write( (char*)linijka , dlug_linijki) )
{
cout << "Blad przy odsylaniu\n";
error();
}
// ===================================
// sprowadzamy potrzebny wiersz ===
// ===================================
// obliczenie, gdzie on w pliku jest
if(! plik.seekg(nr_wiersza_chcianego * dlug_linijki))
{
cout << "Blad pozycjonowania wskaznika czytania"
<< nr_wiersza_chcianego * dlug_linijki
<< endl;
error();
}
// przeczytanie tego fragmentu ------------------------
if(!plik.read( (char*) linijka, dlug_linijki) )
{
cout << "Blad czytania wiersza "
<< nr_wiersza_chcianego << endl;
error();
}
// uaktualnienie notatek
nr_obecnego = nr_wiersza_chcianego;
// zwracamy wskaźnik do tablicy roboczej
return linijka;
}
//
void duza_tablica::error()
{
if(plik.eof()) cout << "Koniec pliku ";
if(plik.fail())
cout << " -FAIL strumienia do pliku : "
<< nazwa_pliku << endl;
exit(1);
}
//
int main()// `8
{
int i, k;
const int wymiar = 13
duza_tablica t("macierz.tmp", wymiar);// `9
// wpisanie jakichś danych do tablicy t
for(i = 0; i < wymiar; i++)
for(k = 0; k < wymiar; k++)
t[i][k] = i * 100 + k;// `10
cout << "Element t [24][7] ma wartosc = "
<< t [24][7] << endl;// `11
// -------------------------------------------
cout << "Przykladowo robimy transpozycje " <<endl;
duza_tablica m("macierz1.tmp", wymiar);// `12
for(i = 0; i < wymiar; i++)
for(k = 0; k < wymiar; k++)
m[i][k] = t[k][i];// `13
cout << "transpozycja skonczona, oto rezultat\n"
"Przykladowo elementy t[7][31] = " << t[7][31]
<< ", \tt[31][7] = " << t[31][7] << endl;
cout << " Natomiast elementy m[7][31] = " << m[7][31]
<< ", \tm[31][7] = " << m[31][7] << endl;
}
//************************************************************