BCB6 Własny format bazy danych, Serialize Jak ??

0

Witam chce napisać prosty format bazy danych
powiedzmy że mam takie struktury i chciał bym to zapisać do pliku

struct naglowek {
    char nag[2]; // Nagłówek pliku
    int    ile_rec; // ilość rekordów w pliku bin
};
struct dane {
    char Tytul[255]; // tytuł który maksymalnie bedzie do 255 znaków
    AnsiString Opis; // Opis tu może być pusto lub bardzo wiele tekstu
};

Jak napisać to w Borland C++ Builder 6, chodzi mi o odczyt i zapis takiej bazy danych lub ewentualnie jak zapisać całą klasę ??

Prosił bym o jakiś kodzik dla BCB6, próbowałem z strony
http://www.gamedev.pl/articles.php?x=view&id=6&comments=1#comments

Niestety wyskakują mi błedy i nie wiem jak to zastosować chciałem sobie napisać prostą bazę niestety nie mam doświadczenia w plikach binarnych, pomoże ktoś ??

Z Góry serdecznie dziękuje za pomoc.

0
struct dane {
    char Tytul[255]; 
    AnsiString Opis; 
};

Dość niekonsekwentnie, Tytul jako tablica char i Opis jako AnsiString, oba mają przechowywać tekst. Gdzie tu logika? Jeśli piszesz w C++, zapomnij o tablicach char do przechowywania tekstu.

Niestety wyskakują mi błedy

Pokaż kod, w którym te błędy wyskakują.

0

Witaj ja tylko napisałem mniej wiecej o co mi chodzi, bo tak, ja to mogę mieć wszystko na zmiennej typu string nie koniecznie AnsiString, tyle że chce uniknać czegoś takiego że jestem ograniczony powiedzmy do 512 znaków i tyle. myślę że mnie rozumiesz o co mi chodzi

a miejsce w którym mi wyżucało błąd to:

struct Potwor {
  std::string nazwa;
  int sila;
};
typedef std::list<Potwor*> PotworList;
PotworList potwory;

dokładnie przyczepiało mi się do std::list

nie mam pojęcia nawet jakie pliki nagłówkowę muszę dołączyć, bo autor niestety nie napisał, ale omijając fakt, chce zbudować prosty własny format danych do przetrzymywania różnych opisów linków itp.

chce po prostu zrobić jakiś prosty format binarny, czy ktoś mógł by coś zaproponować ??, jak wcześniej wspomniałem nie bawiłem się nigdy w zapisywanie plików binarnych dlatego liczę na waszą pomoc.

0

ja to mogę mieć wszystko na zmiennej typu string nie koniecznie AnsiString, tyle że chce uniknać czegoś takiego że jestem ograniczony powiedzmy do 512 znaków i tyle.

Moja uwaga nie dotyczyła AnsiStringa tylko właśnie tablicy Tytul, która jakby nie patrzeć ogranicza cię to tych 255 znaków.

a miejsce w którym mi wyżucało błąd to:

Nie widzę tam błędów. Załączyłeś nagłówek <list>?

nie mam pojęcia nawet jakie pliki nagłówkowę muszę dołączyć

TU znajdziesz odpowiedź.

chce po prostu zrobić jakiś prosty format binarny, czy ktoś mógł by coś zaproponować ??

Np. tak:

struct Potwor 
{
	string nazwa;
	int sila;

	istream& load(istream &is)
	{
		int n;
		int c;

		nazwa.clear();

		is.read((char*)&sila,sizeof(int));
		is.read((char*)&n,sizeof(int)); //<--- czyta ilość znaków

		nazwa.reserve(n); //<--- opcjonalnie

		while(n-- > 0 && (c = is.get()) != EOF) //<--- czyta n znaków do 'nazwa'
			nazwa.push_back(c);

		return is;
	}

	ostream& save(ostream &os)
	{
		os.write((char*)&sila,sizeof(int));
		int n = nazwa.size();
		os.write((char*)&n,sizeof(int)); //<--- zapisuje długość 'nazwa'
		os.write(nazwa.c_str(),n); //<--- zapisuje n znaków z 'nazwa'
		return os;
	}
};

Zapis:

Potwor	obj;

obj.nazwa = "1234567890";
obj.sila = 666;

ofstream os("test.bin");
obj.save(os);

Odczyt:

ifstream is("test.bin");

obj.load(is);

EDIT:
Opcja nieco bardziej elegancka:

template<typename T> istream& read_obj(istream &is,T &obj)
{
	return is.read((char*)&obj,sizeof(obj));
}

template<> istream& read_obj<string>(istream &is,string &obj)
{
	int n;
	int c;

	obj.clear();

	is.read((char*)&n,sizeof(int));

	obj.reserve(n);

	while(n-- > 0 && (c = is.get()) != EOF)
		obj.push_back(c);

	return is;
}

template<typename T> ostream& write_obj(ostream &os,T &obj)
{
	return os.write((char*)&obj,sizeof(obj));
}

template<> ostream& write_obj<string>(ostream &os,string &obj)
{
	int c = obj.size();
	return os.write((char*)&c,sizeof(int)).write(obj.c_str(),c);
}


struct Potwor 
{
	string nazwa;
	int sila;

	istream& load(istream &is)
	{
		read_obj(is,sila)
		return read_obj(is,nazwa);
	}

	ostream& save(ostream &os)
	{
		write_obj(os,sila);
		return write_obj(os,nazwa);
	}
};

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