Binarny i blokowy zapis do pliku tablicy rekordów.

0

Witam :)

Mam pytanie jak w C++ blokowo zapisać ciąg rekordów do pliku. Plik obsługuje w trybie binarnym.
Mam taki fragment kodu :

 struct Rekord
{
	int U,I;
};
...
bool OtworzPoRazPierwszy(wchar_t *n)
	{
		plik.open(n,ios_base::binary | ios_base::in | ios_base::out | ios_base::trunc);
		wcscpy(nazwa,n);
		return plik.is_open();
	}
...
void Zapisz(Rekord dane[])
	{
		plik.write((char*)dane,ILOSC_NA_STRONE);
		plik.flush();
	}

Po wywołaniu funkcji próbuje odczytać dane z pliku

void Czytaj(Rekord blok[])
	{
		plik.read((char*)blok,ILOSC_NA_STRONE);
	}

W pliku znajduje się tylko pierwszy rekord.
Co robię źle ?? :)
Z góry dzięki za pomoc

0
  1. co to jest ILOSC_NA_STRONE?
  2. pokaż jak to wywołujesz.
  3. char* to tablica znaków. tablica bajtów to unsigned char*
0
int main()
{
	Tasma t[3];
	int tryb;
	srand((unsigned int)time(0));
	if(!Inicjuj(t)) 
	{
		cout << "Nie znaleziono plikow!!\n\n";
		system("pause");
		return false;
	}
	while((tryb=Menu())!=3)
	{
		switch(tryb)
		{
		case 1: GenerujOdwrotny(&t[0]); break;
		case 2: Ogladanie(t); break;
		}
	}
	Zamykaj(t);
	return 0;
}

ILOSC_NA_STRONE jest iloscia rekordow jaka wchodzi na strone dyskowa.
Nie moge dać unsigned char,bo funkcja oczekuje wskaźnika na char. Błąd kompilacji powstaje.

0

Soryy nie tą funkcje wkleiłem.

void GenerujOdwrotny(Tasma *t)
{
	int wybor=0;
	Rekord blok[ILOSC_NA_STRONE];
	while(wybor<=0||wybor>=9999999)
	{
		system("cls");
		cout << "\n\tGenerowanie pliku odwrotnie posortowanego\n\tIle rekordow wygenerowac?\n\t";
		wybor=WezLiczbe();
	}
	t->PrzesunNaStartZap();
	for(int i=0;i<wybor/ILOSC_NA_STRONE;i++)
	{		
		for(int j=0;j<ILOSC_NA_STRONE;j++)
		{
			blok[j].I=rand()%10000;
			blok[j].U=rand()%10000;
		}
		t->Zapisz(blok);
	}
	if(wybor%ILOSC_NA_STRONE)
	{
		for(int i=0;i<wybor%ILOSC_NA_STRONE;i++)
		{
			blok[i].I=rand()%10000;
			blok[i].U=rand()%10000;
		}
		for(int i=wybor%ILOSC_NA_STRONE;i<ILOSC_NA_STRONE;i++)
		{
			blok[i].I=INT_MAX;
			blok[i].U=INT_MAX;
		}
		t->Zapisz(blok);
	}
	t->Zamknij();
	t->Otworz();
}
 
0

ILOSC_NA_STRONE jest iloscia rekordow jaka wchodzi na strone dyskowa.

ostream::write jako drugi parametr pobiera ilość bajtów a nie twoich rekordów.
Daj ILOSC_NA_STRONE*sizeof(Rekord)

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