[ Sisko.Marcetic @ 18.10.2007. 10:56 ] @
Imam korisnicki definisan podatak (struct ili class) i bazu podataka fajl
Problem je kako inserovati podatak na odredjenu lokaciju, naime non stop ubacuje
podatak na kraj fajla umesto na zadatu poziciju

Evo koda
Code:

.....

Data data;
FillData(&data); // procedura za zadavanje
int insert_pos = 3; // recimo na trece mesto imamo oko 20 ak zapisa

 .....

ofstream ofile;
ofile.open("Dataoteka.dat" , ios::binary|ios::app);
ofile.seekp(insert_pos * sizeof(Data), ios::beg); // pozicioniranje od pocetka datoteke
ofile.write( (unsigned char*) &data , sizeof (Data) ); // Data - korisnicki definisan podatak
 .....

 


Kod sam pisao iz glave kompajler nije trenutno tu, ali je kod tacan, probao sam sa flagovima
ios::cur i razne akrobacije, ali bezuspesno - stalno ispisuje podatak na kraj fajla.

void HVALA (unapred);
[ X Files @ 18.10.2007. 11:20 ] @
Koliko je meni poznato, ne postoji funkcionalnost "automatskog" umetanja podataka u FAJL stream, jer se to kosi sa načinom kako se zapisi fizički smeštaju na HD-u. Odnosno, nakon "ofile.open" najčešće nije ceo fajl učitan pa da se ima ideja o fizičkim granicama, niti je fajl najčešće fizički smešten u jednom komadu na disku. Naravno, moguce je napraviti funkciju koja umetanje radi u pozadini, pa deluje da je automatski.

Da bi se vršilo umetanje podataka u stream, potrebno je:
* Postaviti tačku upisa/čitanja na poziciju na koju želiš novi upis
* Kopirati sadržaj fajla od te tačke do kraja fajla i to najčešće u memoriju (za fajlove normalne veličine)
* Ponekad ovo prethodno pomeri tačku umetanja, pa je treba 'premotati' na staru poziciju
* Upisati nove podatke
* Upisati privremeni buffer od te tačke (nakon novih upisa) na dalje
* Zatvorti (snimiti) stream
[ Duke Nukem @ 19.10.2007. 14:58 ] @
BCB nam daje fenomenalni objekat TList koji resave sve ovakve probleme.
Tako da je jednostavnije napuniti TList instancu pointerima na korisnicki
definisani objekat ucitavanjem iz fajla (datoteke), pa onda raditi sa njima sta je drago
i na kraju sve to snimiti (overwrite) u datoteku.

mozda ce se neki setiti vectora ili slicnog kontejnera iz STL ali na osnovu mojih iskustava u BCB
komotnije je i pouzdanije koristiti TList.

ps
Ovo vazi za korisnike BCB a ,Izvinjavam se onima koji ne koriste taj kompajler