Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 9 odgovora
  • 101.850 pregleda

Najnovija ↓

c++ rad sa .bin datotekom 14.01.2013. u 11:25 · pre 168 meseci #1
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();
}


Re: c++ rad sa .bin datotekom 14.01.2013. u 15:32 · pre 168 meseci #3
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.
Re: c++ rad sa .bin datotekom 14.01.2013. u 15:53 · pre 168 meseci #4
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.
Re: c++ rad sa .bin datotekom 14.01.2013. u 16:33 · pre 168 meseci #6
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.
Re: c++ rad sa .bin datotekom 14.01.2013. u 16:57 · pre 168 meseci #7
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.
Re: c++ rad sa .bin datotekom 14.01.2013. u 18:07 · pre 168 meseci #10
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.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme