Porownanie z polem struktury w pliku.

0

Witam. Chcialbym napisac funkcje ktora porownuje odczytany z pliku binarnie rekord(a dokladnie jego pole) z napisem wczytanym przez klawiature, niestety nie dziala mi to poprawnie czy ktos wie gdzie jest blad i pomoze ?

Oto funkcja ktora napisalem:

bool Szukaj_Ksiazke(fstream & plik_ksiazek, Ksiazka & ks)
{
plik_ksiazek.open("Ksiazki.dat", ios::in | ios::binary);
if(plik_ksiazek.is_open())
{
string napis;
cin >> napis
plik_ksiazek.seekg(0);
while(plik_ksiazek.read((char*)&ks, sizeof(ks)))
if(ks.tytul == napis)
return true;
return false;
}
}

0
  1. używaj tagów do oznaczenia kodu
  2. co nie działa - bo tak ciężko powiedzieć co jest nie tak. Dodatkowo jak są zapisywane dane w książka.dat itp...
0

czy zamiana 1) na 2) coś zmienia ?

1) cin >> napis
2) getline(cin, napis);
0

Wybaczcie zapomnialem dodac o co mi chodzi :) gdy wpisuje interesujacy mnie tytul, funkcja od poczatku pliku przuszukuje rekordy i porownuje tytuly. Np gdy interesujacy mnie tytul znajduje sie w trzecim rekordzie funkcja powinna opusic petle i w zmiennej ks przechowac interesujacy mnie rekord. Niestety tak nie jest ...

0

Pokaż jak wygląda struktura/klasa Ksiazka.

0

struct Ksiazka
{
enum Gatunek {melodramat, biografia, historyczna, akcja, sensacyjna, dramat};
char tytul[30];
char autor[20];
Gatunek rodzaj;
friend ostream & operator<<(ostream & os, const Ksiazka & ks);
};

1

Hmm.. no to w takim razie jak ty chcesz zastosować taki zapis:

ks.tytul == napis

do char[] ? (Chyba, że czegoś nie wiem)

Wypisz sobie czy na pewno odczytywanie książki masz dobrze zrobione, czyli:

bool Szukaj_Ksiazke(fstream & plik_ksiazek, Ksiazka & ks)
{
    plik_ksiazek.open("Ksiazki.dat", ios::in | ios::binary);
    if(plik_ksiazek.is_open())
    {
        string napis;
        cin >> napis
        plik_ksiazek.seekg(0);
        while(plik_ksiazek.read((char*)&ks, sizeof(ks)))
        {
            cout << "tytul = " << ks.tytul << " autor = " << ks.autor << " rodzaj = " << ks.rodzaj << endl;
            if(napis == ks.tytul)
                return true;
        }
        return false;
    }
}

I jeśli jest wszystko ok, to wywołaj bool operator==(...) ze std::string dla *(const char ) czyli:

if(napis == ks.tytul)
 return true;
0

Probowalem zwrocic ten rekord przez funkcje ale dalej nic ... chociaz nie... teraz zamiast wypisania zawsze ostatniego rekordu pokazuja sie smieci ...

0

Super. Pomogla zamiana tego if i wszytsko dziala :) Dzieki Pozdro.

0

Chociaz nie wroc. Gdy np ksiazka ma wiecej niz slowo jest blad.

0

Nic dziwnego skoro robisz:

cin >> napis;

To pobiera jedno słowo z bufora wejściowego.
Jeśli chcesz pobrać całą jedną linię razem ze spacjami/tabami to robisz:

getline(cin, napis);

Tak jak zresztą napisał kolega powyżej ;-)

0

Boze .. racja :)

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