wyszukiwanie wg kryterium rekordów z pliku

0

Witam, jestem nowy na forum(nie mam zbyt dużo doświadczenia) i mam problem bo nie jestem pewien jak powinienem wykonać wyszukiwanie wg kryterium. Program działa, jeśli chodzi o wczytywanie i zapisywanie danych, nie działają funkcje kryterium1 i kryterium2 . Chcę to zrobić bez typu tablicowego, i nie wiem jak poprawnie zapisać funkcję kryterium1 i kryterium 2 tak by wypisywać tytuły które są danego rodzaju. Byłbym bardzo wdzięczny za podpowiedzi.

#include <iostream>
#include <fstream>
#include<conio.h>
#include<string>
using namespace std;
//---------------------------
struct biblioteka
{
	
    char tytul[20];
    int rok_wyd;
    char rodzaj[20];
    char autor[20];
    char miejsce_wyd[20];
    
    
};
//---------------------------
int menu();
void wprowadz_dane(); //wprowadza dane do pliku dane1.dat
void wyswietl_dane(); //wyswietla dane z pliku dane1.dat
void kryterium(); 
void kasuj(); //kasuje zawartosc pliku dane1.dat
//---------------------------
int main()
{
    int koniec=1,wybor;
    while(koniec)
    {o        wybor=menu();
        
        if(wybor==3)
            koniec=0;
        else
            switch(wybor)
            {
                case 1: wprowadz_dane();
                        break;
                case 2: wyswietl_dane();
                        break;
                case 4: kryterium_1();
                        break;
                case 4: kryterium_2();
                        break;
                case 5: kasuj();
                        break;
            }
    }
    return 0;
}
//---------------------------
int menu()
{
    int wybor;
    cout << "- - - M E N U - - -"<<endl;
    cout << "1-wprowadz dane"<<endl;
    cout << "2-wyswietl dane z pliku"<<endl;
    cout << "3-wyszykiwanie wg kryterium miejsce wydania"<<endl;
    cout << "4-"wyszykiwanie wg kryterium rodzaj"<<endl;
    cout << "5-"skasuj zawartosc pliku"<<endl;
    cout << "6-"zakoncz program"<<endl<<endl;
    cin >> wybor;    
 
    return wybor;   
}
//---------------------------
void wprowadz_dane()
{
    biblioteka a;
	ofstream plik1("dane1.dat", ios::binary | ios::app | ios::out);
	if (!plik1)
	{
        cerr << "Nieudane otwarcie pliku do zapisu\n";
        getch();
        exit(1);
    }

	cout<<"Ile ksiazek chcesz wprowadzic?"<<endl;
	int n;
	cin>>n;
	cout<<endl;
	
	for(int i=0; i<n; i++)
	{
        cout<<"Podaj tytul ksiazki: ";
	    cin>>a.tytul;
	      cout<<"Podaj autora ksiazki: ";
	    cin>>a.autor; 
		 cout<<"Podaj rodzaj ksiazki(epika, liryka, dramat): ";
	    cin>>a.rodzaj; 
		 cout<<"Podaj rok wydania ksiazki: ";
	    cin>>a.rok_wyd; 
		 cout<<"Podaj miejsce wydania ksiazki(Wroclaw, Warszawa, Krakow): ";
	    cin>>a.miejsce_wyd; 
	


    	plik1.write((char*)&a,sizeof (a));
    }
    plik1.close();
    system("cls");
}
//---------------------------
void wyswietl_dane()
{

biblioteka a;
ifstream odczyt ("dane1.dat");

 while (!odczyt.eof())
     {odczyt.read((char*)&a,sizeof (a));
         
         cout<<a.tytul<<endl;
          cout<<a.rodzaj<<endl;
          cout<<a.autor<<endl;
         cout<<a.miejsce_wyd<<endl;
         cout<<a.rok_wyd<<endl;
       }
   odczyt.close ();
	getch();
    system("cls");
}
//---------------------------

   
   
void kryterium()
{biblioteka a;
ifstream odczyt ("dane1.dat");

 while (!odczyt.eof() && a.miejsce_wyd)
     {odczyt.geline((char*)&a,sizeof (a));
         
         cout<<a.tytul<<endl;
       }
}
//---------------------------
void kasuj()
{
	ofstream plik1("dane1.dat", ios::binary | ios::trunc | ios::out);
    plik1.close();        
    system("cls");
}
//---------------------------
1

Proponuje opakować to w klase, i usunąć te rzutowania ( odczytuj bez flagi ::binary ), powinno być łatwiej.
BTW.Jak to Ci sie kompiluje?

0

Sorki, skopiowalem starsza bledna wersje, ta dziala jak pisalem. Jeśli mozna tylko spytac to czy dałoby rade porównac wartości porownać komenda: ***strcmp *** bo nie chodzi mi raczej o zmniane w calym programie ale tylko jak nalezy wczytywac poszczególne rekordy by sprawdzic czy

np.: a.rodzaj to ciag znaków "liryka"

 #include <iostream>
#include <fstream>
#include<conio.h>
#include<string>
using namespace std;
//---------------------------
struct biblioteka
{
 
    char tytul[20];
    int rok_wyd;
    char rodzaj[20];
    char autor[20];
    char miejsce_wyd[20];
 
 
};
//---------------------------
int menu();
void wprowadz_dane(); //wprowadza dane do pliku dane1.dat
void wyswietl_dane(); //wyswietla dane z pliku dane1.dat
void kryterium_1(); 
void kryterium_2();
void kasuj(); //kasuje zawartosc pliku dane1.dat
//---------------------------
int main()
{
    int koniec=1,wybor;
    while(koniec)
    {       wybor=menu();
 
        if(wybor==3)
            koniec=0;
        else
            switch(wybor)
            {
                case 1: wprowadz_dane();
                        break;
                case 2: wyswietl_dane();
                        break;
                case 3: kryterium_1();
                        break;
                case 4: kryterium_2();
                        break;
                case 5: kasuj();
                        break;
            }
    }
    return 0;
}
//---------------------------
int menu()
{
    int wybor;
    cout << "- - - M E N U - - -"<<endl;
    cout << "1-wprowadz dane"<<endl;
    cout << "2-wyswietl dane z pliku"<<endl;
    cout << "3-wyszykiwanie wg kryterium miejsce wydania"<<endl;
    cout << "4-wyszykiwanie wg kryterium rodzaj"<<endl;
    cout << "5-skasuj zawartosc pliku"<<endl;
    cout << "6-zakoncz program"<<endl<<endl;
    cin >> wybor;    
 
    return wybor;   
}
//---------------------------
void wprowadz_dane()
{
    biblioteka a;
    ofstream plik1("dane1.dat",  ios::app | ios::out);
    if (!plik1)
    {
        cerr << "Nieudane otwarcie pliku do zapisu\n";
        getch();
        exit(1);
    }
 
    cout<<"Ile ksiazek chcesz wprowadzic?"<<endl;
    int n;
    cin>>n;
    cout<<endl;
 
    for(int i=0; i<n; i++)
    {
        cout<<"Podaj tytul ksiazki: ";
        cin>>a.tytul;
          cout<<"Podaj autora ksiazki: ";
        cin>>a.autor; 
         cout<<"Podaj rodzaj ksiazki(epika, liryka, dramat): ";
        cin>>a.rodzaj; 
         cout<<"Podaj rok wydania ksiazki: ";
        cin>>a.rok_wyd; 
         cout<<"Podaj miejsce wydania ksiazki(Wroclaw, Warszawa, Krakow): ";
        cin>>a.miejsce_wyd; 
 
 
 
        plik1.write((char*)&a,sizeof (a));
    }
    plik1.close();
    system("cls");
}
//---------------------------
void wyswietl_dane()
{
 
biblioteka a;
ifstream odczyt ("dane1.dat");
 
 while (!odczyt.eof())
     {odczyt.read((char*)&a,sizeof (a));
 
         cout<<a.tytul<<endl;
          cout<<a.rodzaj<<endl;
          cout<<a.autor<<endl;
         cout<<a.miejsce_wyd<<endl;
         cout<<a.rok_wyd<<endl;
       }
   odczyt.close ();
    getch();
    system("cls");
}
//---------------------------
 
 
 
void kryterium_1()
{biblioteka a;
ifstream odczyt ("dane1.dat");
 
 while (!odczyt.eof() && a.miejsce_wyd)
     {odczyt.getline((char*)&a,sizeof (a));
 
         cout<<a.tytul<<endl;
       }
}

void kryterium_2()
{biblioteka a;
ifstream odczyt ("dane1.dat");
 
 while (!odczyt.eof() && a.miejsce_wyd)
     {odczyt.getline((char*)&a,sizeof (a));
 
         cout<<a.tytul<<endl;
       }
}
//---------------------------
void kasuj()
{
    ofstream plik1("dane1.dat", ios::trunc | ios::out);
    plik1.close();        
    system("cls");
}

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