Porownanie z polem struktury w pliku.

Odpowiedz Nowy wątek
2015-04-17 00:14
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;
}
}

Pozostało 580 znaków

2015-04-17 08:05
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...


Ogólnie na prace domowe mam stawki zaporowe. Czasem coś o programowaniu znajdzie się na mojej stronie

Pozostało 580 znaków

2015-04-17 18:00
0

czy zamiana 1) na 2) coś zmienia ?

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

Pozostało 580 znaków

2015-04-18 09:19
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 ...

Pozostało 580 znaków

2015-04-18 11:50

Pokaż jak wygląda struktura/klasa Ksiazka.


Asm/C/C++

Pozostało 580 znaków

2015-04-18 12:07
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);
};

Pozostało 580 znaków

2015-04-18 12:13
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;

Asm/C/C++
edytowany 3x, ostatnio: mwl4, 2015-04-18 13:09

Pozostało 580 znaków

2015-04-18 12:16
0

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

Pozostało 580 znaków

2015-04-18 12:29
0

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

Pozostało 580 znaków

2015-04-18 12:55
0

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

Pozostało 580 znaków

2015-04-18 13:04
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 ;-)


Asm/C/C++
edytowany 1x, ostatnio: mwl4, 2015-04-18 13:05

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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