Nie chcę mieć fstream w kontenerze vector. Chce mieć raz zadeklarowany plik na którym będę wykonywał operacje zapisu odczytu.
#include <iostream>
#include <string>
#include <fstream>
#include <cstdlib>
using namespace std;
struct ksiazki
{
string tytul;
string autor;
string wydawnictwo;
int rok;
int strony;
};
void czyszczenie_strumienia_i_buforu()
{
cin.clear();
cin.sync();
}
void naglowek()
{
cout << "\t\t Witaj w programie! Created by Unlimited!" << endl;
cout << "\t\t [ Projekt: zadanie domowe z PSiO ]" << endl << endl;
}
void dodaj( ksiazki tablica[], int & n, int & ilosc, bool & sprawdz )
{
naglowek();
if( n < ilosc )
{
cout << "Podaj tytul ksiazki: ";
czyszczenie_strumienia_i_buforu();
getline( cin, tablica[ n ].tytul );
cout << "Podaj autora: ";
getline( cin, tablica[ n ].autor );
cout << "Podaj wydawnictwo ksiazki: ";
getline( cin, tablica[ n ].wydawnictwo );
do
{
cout << "Podaj rok wydania: ";
czyszczenie_strumienia_i_buforu();
cin >> tablica[ n ].rok;
sprawdz = cin.good();
} while( sprawdz == false );
do
{
cout << "Podaj ilosc stron: ";
czyszczenie_strumienia_i_buforu();
cin >> tablica[ n ].strony;
sprawdz = cin.good();
} while( sprawdz == false );
n++;
cout << endl << "Dodano pomyslnie!" << endl << endl;
}
else
{
cout << "Miejsca na ksiazki zostaly zapelnione!" << endl << endl;
}
system( "pause" );
}
void edytuj( ksiazki tablica[], int & n, int & x, bool & sprawdz )
{
naglowek();
if( n != 0 )
{
do
{
cout << "Podaj LP wpisu ksiazki: ";
czyszczenie_strumienia_i_buforu();
cin >> x;
sprawdz = cin.good();
} while( sprawdz == false || x > n || x <= 0 );
cout << endl << "Aktualne zestawienie: " << endl;
cout << x;
x--;
cout << ". Tytul: " << tablica[ x ].tytul << endl;
cout << " Autor: " << tablica[ x ].autor << endl;
cout << " Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
cout << " Rok wydania: " << tablica[ x ].rok << endl;
cout << " Ilosc stron: " << tablica[ x ].strony << endl << endl;
cout << "Podaj nowe zestawienie: " << endl;
cout << x + 1 << ". Tytul: ";
czyszczenie_strumienia_i_buforu();
getline( cin, tablica[ x ].tytul );
cout << " Autor: ";
getline( cin, tablica[ x ].autor );
cout << " Wydawnictwo: ";
getline( cin, tablica[ x ].wydawnictwo );
do
{
cout << " Rok wydania: ";
czyszczenie_strumienia_i_buforu();
cin >> tablica[ x ].rok;
sprawdz = cin.good();
} while( sprawdz == false );
do
{
cout << " Ilosc stron: ";
czyszczenie_strumienia_i_buforu();
cin >> tablica[ x ].strony;
sprawdz = cin.good();
} while( sprawdz == false );
cout << endl << "Zedytowano pomyslnie!" << endl << endl;
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
system( "pause" );
}
void usun( ksiazki tablica[], int & n, int & ilosc, int & x, bool & sprawdz )
{
naglowek();
if( n != 0 )
{
do
{
cout << "Podaj LP wpisu ksiazki: ";
czyszczenie_strumienia_i_buforu();
cin >> x;
sprawdz = cin.good();
x--;
} while( sprawdz == false || x >= n || x < 0 );
for( x; x < n; x++ )
{
if( x != ilosc - 1 )
{
tablica[ x ] = tablica[ x + 1 ];
}
}
n--;
cout << endl << "Usunieto pomyslnie!" << endl << endl;
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
system( "pause" );
}
void szukaj_tytul( size_t & ZnalezionaFraza, ksiazki tablica[], string & fraza, int & x, int & n )
{
naglowek();
if( n != 0 )
{
cout << "Podaj tytul: ";
czyszczenie_strumienia_i_buforu();
getline( cin, fraza );
for( x = 0; x < n; x++ )
{
ZnalezionaFraza = tablica[ x ].tytul.find( fraza );
if( ZnalezionaFraza != string::npos )
{
cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
cout << " Autor: " << tablica[ x ].autor << endl;
cout << " Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
cout << " Rok wydania: " << tablica[ x ].rok << endl;
cout << " Ilosc stron: " << tablica[ x ].strony << endl;
}
else
{
cout << endl << x + 1 << ". Brak wynikow" << endl;
}
}
cout << endl << endl;
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
system( "pause" );
}
void szukaj_autor( size_t & ZnalezionaFraza, ksiazki tablica[], string & fraza, int & x, int & n )
{
naglowek();
if( n != 0 )
{
cout << "Podaj autora: ";
czyszczenie_strumienia_i_buforu();
getline( cin, fraza );
for( x = 0; x < n; x++ )
{
ZnalezionaFraza = tablica[ x ].autor.find( fraza );
if( ZnalezionaFraza != string::npos )
{
cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
cout << " Autor: " << tablica[ x ].autor << endl;
cout << " Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
cout << " Rok wydania: " << tablica[ x ].rok << endl;
cout << " Ilosc stron: " << tablica[ x ].strony << endl;
}
else
{
cout << endl << x + 1 << ". Brak wynikow" << endl;
}
}
cout << endl << endl;
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
system( "pause" );
}
void szukaj_wydawnictwo( size_t & ZnalezionaFraza, ksiazki tablica[], string & fraza, int & x, int & n )
{
naglowek();
if( n != 0 )
{
cout << "Podaj wydawnictwo: ";
czyszczenie_strumienia_i_buforu();
getline( cin, fraza );
for( x = 0; x < n; x++ )
{
ZnalezionaFraza = tablica[ x ].wydawnictwo.find( fraza );
if( ZnalezionaFraza != string::npos )
{
cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
cout << " Autor: " << tablica[ x ].autor << endl;
cout << " Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
cout << " Rok wydania: " << tablica[ x ].rok << endl;
cout << " Ilosc stron: " << tablica[ x ].strony << endl;
}
else
{
cout << endl << x + 1 << ". Brak wynikow" << endl;
}
}
cout << endl << endl;
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
system( "pause" );
}
void szukaj_rok( ksiazki tablica[], int & liczba, int & x, int & n, bool & sprawdz )
{
naglowek();
if( n != 0 )
{
do
{
cout << "Podaj rok wydania: ";
czyszczenie_strumienia_i_buforu();
cin >> liczba;
sprawdz = cin.good();
} while( sprawdz == false );
for( x = 0; x < n; x++ )
{
if( tablica[ x ].rok == liczba )
{
cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
cout << " Autor: " << tablica[ x ].autor << endl;
cout << " Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
cout << " Rok wydania: " << tablica[ x ].rok << endl;
cout << " Ilosc stron: " << tablica[ x ].strony << endl;
}
else
{
cout << endl << x + 1 << ". Brak wynikow" << endl;
}
}
cout << endl << endl;
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
system( "pause" );
}
void szukaj_strony( ksiazki tablica[], int & dol, int & gora, int & x, int & n, bool & sprawdz )
{
naglowek();
if( n != 0 )
{
do
{
cout << "Podaj dolny prog ilosci stron: ";
czyszczenie_strumienia_i_buforu();
cin >> dol;
sprawdz = cin.good();
} while( sprawdz == false );
do
{
cout << "Podaj gorny prog ilosci stron: ";
czyszczenie_strumienia_i_buforu();
cin >> gora;
sprawdz = cin.good();
} while( sprawdz == false || gora < dol );
for( x = 0; x < n; x++ )
{
if( tablica[ x ].strony >= dol && tablica[ x ].strony <= gora )
{
cout << endl << x + 1 << ". Tytul: " << tablica[ x ].tytul << endl;
cout << " Autor: " << tablica[ x ].autor << endl;
cout << " Wydawnictwo: " << tablica[ x ].wydawnictwo << endl;
cout << " Rok wydania: " << tablica[ x ].rok << endl;
cout << " Ilosc stron: " << tablica[ x ].strony << endl;
}
else
{
cout << endl << x + 1 << ". Brak wynikow" << endl;
}
}
cout << endl << endl;
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
system( "pause" );
}
void wyswietl( ksiazki tablica[], int & n )
{
naglowek();
if( n != 0 )
{
int lp = 1;
for( int v = 0; v < n; v++ )
{
cout << lp << ". Tytul: " << tablica[ v ].tytul << endl;
cout << " Autor: " << tablica[ v ].autor << endl;
cout << " Wydawnictwo: " << tablica[ v ].wydawnictwo << endl;
cout << " Rok wydania: " << tablica[ v ].rok << endl;
cout << " Ilosc stron: " << tablica[ v ].strony << endl << endl;
lp++;
}
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
system( "pause" );
}
void utworz_plik( fstream & plik, string & odnosnik, int & n, ksiazki tablica[] )
{
naglowek();
plik.open( odnosnik.c_str(), ios::out );
plik.close();
if( plik.good() )
{
if( n != 0 )
{
plik.open( odnosnik.c_str(), ios::out | ios::app );
plik << "\t\t Witaj w programie! Created by Unlimited!" << endl;
plik << "\t\t [ Projekt: zadanie domowe z PSIO ]" << endl << endl;
int lp = 1;
for( int v = 0; v < n; v++ )
{
plik << lp << ". Tytul: " << tablica[ v ].tytul << endl;
plik << " Autor: " << tablica[ v ].autor << endl;
plik << " Wydawnictwo: " << tablica[ v ].wydawnictwo << endl;
plik << " Rok wydania: " << tablica[ v ].rok << endl;
plik << " Ilosc stron: " << tablica[ v ].strony << endl << endl;
lp++;
}
plik.close();
cout << "Dane zostaly zapisane pomyslnie!" << endl << endl;
}
else
{
cout << "Najpierw stworz jakikolwiek wpis ksiazki!" << endl << endl;
}
}
else
{
cout << "Error! Nie udalo sie utworzyc pliku!" << endl << endl;
cout << "Mozliwe bledy:" << endl;
cout << " - odnosnik do pliku nie zostal podany" << endl;
cout << " - odnosnik do pliku jest nieprawidlowy" << endl;
cout << " - brak odpowiednich uprawnien w systemie" << endl << endl;
}
system( "pause" );
}
void usun_plik( string & odnosnik )
{
remove( odnosnik.c_str() );
}
void sciezka( string & odnosnik )
{
naglowek();
cout << "Uwaga!!! Pamietaj aby podac prawidlowa sciezke do pliku!" << endl;
cout << "Podajac sama nazwe pliku np - plik.txt - dokument tekstowy" << endl;
cout << "zostanie utworzony w katalogu z uruchomionym programem." << endl << endl;
cout << "Podaj sciezke pliku z rozszerzeniem .txt: ";
czyszczenie_strumienia_i_buforu();
getline( cin, odnosnik );
}
void pokaz( fstream & plik, string & odnosnik, string & napis, int & n )
{
naglowek();
plik.open( odnosnik.c_str(), ios::in );
plik.close();
if( plik.good() )
{
plik.open( odnosnik.c_str(), ios::in );
while( !plik.eof() )
{
getline( plik, napis );
cout << napis << endl;
}
plik.close();
}
else
{
cout << "Error! Nie udalo sie otworzyc pliku!" << endl << endl;
cout << "Mozliwe bledy:" << endl;
cout << " - plik nie istnieje" << endl;
cout << " - brak odpowiednich uprawnien w systemie" << endl;
}
cout << endl;
system( "pause" );
}
void sprawdz_sciezke( string & odnosnik )
{
naglowek();
cout << "Aktualny plik to: " << odnosnik << endl << endl;
system( "pause" );
}
void info()
{
naglowek();
cout << "Wykonanie: XXX" << endl;
cout << "Klasa: II bT (2011/2012)" << endl;
cout << "Srodowisko: Code::Bloks 10.05" << endl;
cout << "Kompilator: GNU GCC" << endl;
cout << "E-mail: XXX" << endl << endl;
cout << "Dodatkowe:" << endl;
cout << " + Program zabezpieczony jest przed 'niesfornym' uzytkownikiem" << endl;
cout << " i nie da sie go 'zcrashowac' np podajac litere badz wyraz" << endl;
cout << " do zmiennej 'int' (rok wydania, ilosc stron)." << endl;
cout << " + Program dostepny na platformy: Linux / Windows (x32, x64)" << endl;
cout << " - Program konsolowy. Byc moze niedlugo bedzie graficzny." << endl;
cout << " - Nie gwarantuje poprawnosci kodu zrodlowego programu z innymi" << endl;
cout << " kompilatorami niz w/w." << endl << endl;
system( "pause" );
}
int main()
{
int n = 0;
int ilosc, wybor1, wybor2, wybor3, x, liczba, dol, gora;
bool sprawdz;
string odnosnik, napis, fraza;
fstream plik;
size_t ZnalezionaFraza;
do
{
system( "cls" );
naglowek();
cout << "\t Na ile ksiazek zrobic miejsce?: (rozmiar tablicy) ";
czyszczenie_strumienia_i_buforu();
cin >> ilosc;
sprawdz = cin.good();
} while( sprawdz == false || ilosc <= 0 );
ksiazki tablica[ ilosc ];
do
{
do
{
system( "cls" );
naglowek();
cout << "[1] Dodaj nowa ksiazke" << endl;
cout << "[2] Edytuj ksiazke" << endl;
cout << "[3] Usun ksiazke" << endl;
cout << "[4] Wyswietl/Wyszukaj ksiazki" << endl;
cout << "[5] Opcje" << endl;
cout << "[6] Wykonanie/Kontakt" << endl;
cout << "[0] Zakoncz" << endl << endl;
cout << "Twoj wybor: ";
czyszczenie_strumienia_i_buforu();
cin >> wybor1;
sprawdz = cin.good();
system( "cls" );
} while( sprawdz == false );
switch( wybor1 )
{
case 1:
{
dodaj( tablica, n, ilosc, sprawdz );
break;
}
case 2:
{
edytuj( tablica, n, x, sprawdz );
break;
}
case 3:
{
usun( tablica, n, ilosc, x, sprawdz );
break;
}
case 4:
{
do
{
do
{
system( "cls" );
naglowek();
cout << "[1] Szukaj - Tytul" << endl;
cout << "[2] Szukaj - Autor" << endl;
cout << "[3] Szukaj - Wydawnictwo" << endl;
cout << "[4] Szukaj - Rok wydania" << endl;
cout << "[5] Szukaj - Ilosc stron" << endl;
cout << "[6] Pokaz wszystkie" << endl;
cout << "[0] Powrot" << endl << endl;
cout << "Twoj wybor: ";
czyszczenie_strumienia_i_buforu();
cin >> wybor2;
sprawdz = cin.good();
system( "cls" );
} while( sprawdz == false );
switch( wybor2 )
{
case 1:
{
szukaj_tytul( ZnalezionaFraza, tablica, fraza, x, n );
break;
}
case 2:
{
szukaj_autor( ZnalezionaFraza, tablica, fraza, x, n );
break;
}
case 3:
{
szukaj_wydawnictwo( ZnalezionaFraza, tablica, fraza, x, n );
break;
}
case 4:
{
szukaj_rok( tablica, liczba, x, n, sprawdz );
break;
}
case 5:
{
szukaj_strony( tablica, dol, gora, x, n, sprawdz );
break;
}
case 6:
{
wyswietl( tablica, n );
break;
}
}
} while( wybor2 != 0 );
break;
}
case 5:
{
do
{
do
{
system( "cls" );
naglowek();
cout << "[1] Utworz plik z danymi" << endl;
cout << "[2] Usun plik z danymi" << endl;
cout << "[3] Podaj sciezke pliku" << endl;
cout << "[4] Pokaz zawartosc pliku" << endl;
cout << "[5] Sprawdz aktualny odnosnik pliku" << endl;
cout << "[0] Powrot" << endl << endl;
cout << "Twoj wybor: ";
czyszczenie_strumienia_i_buforu();
cin >> wybor3;
sprawdz = cin.good();
system( "cls" );
} while( sprawdz == false );
switch( wybor3 )
{
case 1:
{
utworz_plik( plik, odnosnik, n, tablica );
break;
}
case 2:
{
usun_plik( odnosnik );
break;
}
case 3:
{
sciezka( odnosnik );
break;
}
case 4:
{
pokaz( plik, odnosnik, napis, n );
break;
}
case 5:
{
sprawdz_sciezke( odnosnik );
break;
}
}
} while( wybor3 != 0 );
break;
}
case 6:
{
info();
break;
}
}
} while( wybor1 != 0 );
return 0;
}
Program napisany na vector zamiast tablicy = nie działa.