[ Lukic111 @ 14.01.2013. 10:25 ] @
Pokusavam da obrisem jednu strukturu iz binarne datoteke imenik.bin, ali po ovom algoritnu ne radi.
Jel ima neko resenje ?


Code:
void brisanje(void)
{
    char ime[30];

    f1.open("imenik.bin",ios::in | ios::out| ios::binary);

    if (!f1)
    {
        cout<<"Greska pri otvaranju datoteke";
        exit(1);
    }

    f2.open("pom.bin",ios::in | ios::out | ios::binary);

    if (!f1)
    {
        cout<<"Greska pri otvaranju pomocne datoteke";
        exit(1);
    }

    f1.seekg(0,ios::beg);

    while (1)//kopira iz jedne datoteke u drugu
    { 
        f1.read((char*)&osoba,sizeof(struct adresar));

        if (f1.eof()!=0) break;

        f2.write((char*)&osoba,sizeof(struct adresar));
    }

    f1.seekp(0,ios::beg);f2.seekg(0,ios::beg);

    cout<<"\nUnesite ime koje zelite da obrisete "; cin>>ime;

    while (1)
    {
        f2.read((char*)&osoba,sizeof(struct adresar));

        if (f2.eof()!=0) break;

        if (strcmp(ime,osoba.ime)==0) continue; 

        f1.write((char*)&osoba,sizeof(struct adresar)); 
    }

    f1.close();
    f2.close();

    glavni_meni();
}


[ Mihajlo Cvetanović @ 14.01.2013. 10:40 ] @
Kako se to vidi da ne radi? Daj detalje, ne znamo da čitamo misli.
[ Lukic111 @ 14.01.2013. 14:32 ] @
Ovako ovaj deo koda treba da kopira iz imenik.bin (gde se nalazi struktura ) u pom.bin, to uradi dobro (sadrzaji te dve datoteke su isti kada se otvore).

while (1)//kopira iz jedne datoteke u drugu
{
f1.read((char*)&osoba,sizeof(struct adresar));

if (f1.eof()!=0) break;

f2.write((char*)&osoba,sizeof(struct adresar));
}


Posle toga kopira iz pom.bin u imenik.bin sve structure sem one koje sadrze uneseno ime.

while (1)
{
f2.read((char*)&osoba,sizeof(struct adresar));

if (f2.eof()!=0) break;

if (strcmp(ime,osoba.ime)==0) continue;

f1.write((char*)&osoba,sizeof(struct adresar));
}

Ali I tada kada otvorim obe datoteke nalazi se isti sadrzaj.

Nadam se da je sada ok objasnjenje ako nije poslacu ceo projekat.
[ Mihajlo Cvetanović @ 14.01.2013. 14:53 ] @
Postoje dve mogućnosti, prva je da se fajl imenik.bin nije uopšte ni promenio, niti je išta u njega upisano, a druga je da je u njega uspisan istovetan sadržaj. Moraš nekako da odbaciš jednu od ove dve mogućnosti, tako da znamo gde da gledamo dalje.

Ako fajl nije uopšte promenjen onda treba videti zašto. Ako je fajl promenjen tako da je isti kao što je i bio onda je verovatno problem što se nikad ne izvrši onaj continue, to jest funkcija strcmp nikad ne vrati nulu. Probaj da debaguješ korak po korak i vidiš šta se dešava u tom delu sa strcmp/continue. U Visual Studiu debagovanje je lakše ako je svaka instrukcija u posebnoj liniji, i na tvom mestu ja bih za potrebe debagovanja ovaj continue stavio u posebnu liniju, iako ne radiš u VS.
[ Lukic111 @ 14.01.2013. 15:24 ] @
strcmo pradi regularno to sam proverio u deubug-modu a evo poslavu ti ceo projekat da vidis, ja sam probao sve zivo da menjam ali ne vredi.
Opcija 4 je za brisanje.

http://rapidshare.com/files/30...ojvodic%20seminarski%20rad.rar
[ Mihajlo Cvetanović @ 14.01.2013. 15:33 ] @
Jesi li proverio da li se fajl uopšte menja? Umesto koda koji ispisuje sličan sadržaj u fajl napravi kod koji ispisuje nešto totalno različito i vidi šta se nalazi u fajlu. Ako se u fajlu ne nalazi to totalno različito onda se fajl nije ni promenio. Možda je to totalno različito upisano u fajl koji se nalazi negde drugde.
[ Lukic111 @ 14.01.2013. 15:57 ] @
Meni se cini da u opste ne menja sadrzaj datoteke imenik.pom.

while(1){

f2.read((char*)&osoba,sizeof(struct adresar));
if(f2.eof()!=0)
break;
if(strcmp(ime,osoba.ime)==0)
continue;
strcpy(osoba.ime,"TEST");
f1.write((char*)&osoba,sizeof(struct adresar));


}

posle ovoga imena ostaju ne promenjena.
[ Mihajlo Cvetanović @ 14.01.2013. 16:13 ] @
Otkud sad imenik.pom? Dva fajla su imenik.bin i pom.bin.
[ Lukic111 @ 14.01.2013. 16:31 ] @
Izvini greska u kucanju imenik.bin
[ Mihajlo Cvetanović @ 14.01.2013. 17:07 ] @
Pošto se fajl ne menja treba videti zašto. To ti moraš da vidiš. Možda se fajl kreira na nekom drugom mestu. Možda nemaš prava da upisuješ u fajl.

U svakom slučaju moraš da imaš hendlovanje grešaka, koje trenutno ne postoji u kodu. Pretpostavljam da su promenljive f1 i f2 tipa ostream. Funkcija ostream::write vraća grešku na dva načina, jedno je preko izuzetaka, a drugo je pomoću funkcije ios::bad. Preporučujem da uključiš rad sa izuzecima, pomoću funkcije ios::exceptions, i da onda hvataš izuzetke pomoću try-catch koda.