Witam
Mam problem, z odczytem z pliku tekstowego. Wiem, wiem, było już masa tematów podobnych do tego, ale nic podobnego nie udało mi się znaleźć. Stworzyłem klasę Książka i program a'la księgarnia, w którym można dodać książkę, wyszukać spośród wprowadzonych już książek, książki których cena mieści się w danym przedziale oraz wyświetlić wszystkie wprowadzone już ksiażki. Duża część programu opiera się na wczytywaniu/odczytywaniu danych z pliku tekstowego w którym znajdują się wprowadzone książki. Na potrzeby tego programu przeciążyłem operatory strumieniowe (<<,>>) do wprowadzania/wyprowadzania obiektów klasy Książka z klawiatury, z pliku tekstowego, do na ekran komputera, do pliku tekstowego.
Co do mojego problemu. Po uruchomieniu programu i wybraniu, którejkolwiek z funkcji (zapis nowej pozycji do pliku tekstowego, wyświetlenie pozycji z odpowiednią ceną lub wyświetleniu wszystkich pozycji znajdujących się w pliku tekstowym) wszystko jest OK. Jednak po ponownym wybraniu, funkcji związanej z odczytem danych z pliku tekstowego, pojawia się problem z otworzeniem pliku tekstowego (metoda good() zwraca wartość false). I tu pojawia się moje pytanie, gdzie może być błąd? Czy tkwi w obsłudze zapisu/odczytu ze strumienia z pliku/do pliku? Czy być może coś jest nie tak w przeciążaniu operatorów strumieniowych. Za zainteresowanie tematem i wszelkie wskazówki będą bardzo wdzięczny. Program stworzony w środowisku C++ Builder XE7. Poniżej zamieszczam kody źródłowe
Program głowny:
#pragma hdrstop
#pragma argsused
#ifdef _WIN32
#include <tchar.h>
#else
typedef char _TCHAR;
#define _tmain main
#endif
#include <stdio.h>
#include <iostream.h> //***
#include <fstream.h> //***
#include <windows.h> //***
#include <string> //***
#include <iomanip> //***
#include "Ksiazka.h" //***
#include "Funkcje.h" //***
#include <stdlib.h> //***
using namespace std;
void menu(void)
{
cout<<"KSIEGARNIA - MENU\n";
cout<<"1. Dodanie nowej ksiazki.\n";
cout<<"2. Wyswietlenie ksiazek z podanego zakresu cenowego.\n";
cout<<"3. Wyswietlenie wszystkich ksiazek oferowanych przez ksiegarnie.\n";
cout<<"4. Zamkniecie aplikacji.\n";
}
int _tmain(int argc, _TCHAR* argv[])
{
menu();
Ksiazka* wsk_k1=NULL;
ifstream PlikIN;
ofstream PlikOUT;
//****************************************
int wybor_uzytkownika;
cin>>wybor_uzytkownika;
double price=0.0;
while (!(wybor_uzytkownika==4))
{
while (wybor_uzytkownika<1 && wybor_uzytkownika>4)
{
cout<<"WYBIERZ LICZBE 1, 2, 3 LUB 4, ABY PRZEJSC DALEJ!!!";
Sleep(1000);
system("cls");
menu();
cin>>wybor_uzytkownika;
}
switch (wybor_uzytkownika)
{
case 1:
wsk_k1=new Ksiazka[1];
system("cls");
cout<<"DODANIE NOWEJ KSIAZKI\n";
PlikOUT.open("Baza danych.txt",ios::out|ios::app);
if (PlikOUT.good()==false) {
cout<<"Blad otwarcia pliku!!!\n";
}
cin>>wsk_k1[0];
PlikOUT<<wsk_k1[0];
delete[] wsk_k1;
PlikOUT.close();
cout<<"\nAby powrocic do menu, nacisnij dowolny przycisk...\n";
cin.get();
cin.get();
break;
case 2:
system("cls");
cout<<"WYSWIETLENIE KSIAZEK Z PODANEGO ZAKRESU CENOWEGO(+/- 5zl)\n";
cout<<"Wprowadz cene: ";
cin>>price;
PlikIN.open("Baza danych.txt",ios::in);
wsk_k1=new Ksiazka[1];
if (PlikIN.good()==false) {
cout<<"Blad otwarcia pliku!!!\n";
}
while (PlikIN>>wsk_k1[0])
{
if (wsk_k1[0]>=(price-5.00) && wsk_k1[0]<=(price+5.00))
cout<<wsk_k1[0];
}
delete[] wsk_k1;
PlikIN.close();
cout<<"\nAby powrocic do menu, nacisnij dowolny przycisk...\n";
cin.get();
cin.get();
break;
case 3:
system("cls");
cout<<"WYSWIETLENIE WSZYSTKICH OFEROWANYCH KSIAZEK\n";
PlikIN.open("Baza danych.txt",ios::in);
wsk_k1=new Ksiazka[1];
if (PlikIN.good()==false) {
cout<<"Blad otwarcia pliku!!!\n";
}
while (PlikIN>>wsk_k1[0])
{
cout<<wsk_k1[0];
}
delete[] wsk_k1;
PlikIN.close();
cout<<"\nAby powrocic do menu, nacisnij dowolny przycisk...\n";
cin.get();
break;
}
system("cls");
menu();
cin>>wybor_uzytkownika;
}
system ("cls");
cout<<"DZIEKUJE ZA KORZYSTANIE Z PROGRAMU\n";
cout<<"\nNacisnij dowolny przycisk, aby zakonczyc...";
cin.get();
return 0;
}
Plik .cpp z implementacją metod klasy Ksiazka
//Implementacja klasy Ksiazka
#include "Ksiazka.h"
#include <iostream.h>
#include <fstream.h>
#include <iomanip.h>
#include <string>
Ksiazka::Ksiazka()
{
tytul="";
jezyk="";
cena=0.0;
}
Ksiazka::Ksiazka(string Tytul, string Jezyk,double Cena)
{
tytul=Tytul;
jezyk=Jezyk;
cena=Cena;
}
ostream& operator<<(ostream& wyj, const Ksiazka& book)
{
wyj<<fixed<<setprecision(2)<<setw(30)<<left;
wyj<<book.tytul<<setw(15)<<left<<book.jezyk<<setw(5)<<left<<book.cena<<endl;
return wyj;
}
istream& operator>>(istream& wej, Ksiazka& book)
{
cout<<"Tytul: "<<endl;
getline(cin,book.tytul);
cout<<"Jezyk: "<<endl;
wej>>book.jezyk;
do
{
cout<<"Cena: "<<endl;
wej>>book.cena;
} while (book.cena<0.0);
return wej;
}
ostream& operator<<(ostream& wyj, const Ksiazka* book)
{
wyj<<fixed<<setprecision(2)<<setw(30)<<left;
wyj<<book->tytul<<setw(15)<<left<<book->jezyk<<setw(5)<<left<<book->cena<<endl;
return wyj;
}
istream& operator>>(istream& wej, Ksiazka* book)
{
cout<<"Tytul:"<<endl;
getline(wej, book->tytul);
cout<<"Jezyk:"<<endl;
wej>>book->jezyk;
do
{
cout<<"Cena:"<<endl;
wej>>book->cena;
} while (book->cena<0.0);
return wej;
}
ofstream& operator<<(ofstream& wyj, const Ksiazka& book)
{
string temp=book.tytul;
for (int i = 0; i < temp.length()+1; ++i) {
if (temp[i]==' ') {
temp[i]='*';
}
}
wyj<<fixed<<setprecision(2)<<setw(30)<<left;
wyj<<temp<<setw(15)<<left<<book.jezyk<<setw(5)<<left<<book.cena<<endl;
return wyj;
}
ifstream& operator>>(ifstream& wej, Ksiazka& book)
{
string temp;
wej>>book.tytul>>book.jezyk>>book.cena;
temp=book.tytul;
for (int i = 0; i < temp.length()+1; ++i)
{
if (temp[i]=='*')
{
temp[i]=' ';
}
}
book.tytul=temp;
return wej;
}
ofstream& operator<<(ofstream& wyj, const Ksiazka* book)
{
string temp=book->tytul;
for (int i = 0; i < temp.length()+1; ++i) {
if (temp[i]==' ') {
temp[i]='*';
}
}
wyj<<fixed<<setprecision(2)<<setw(30)<<left;
wyj<<temp<<setw(15)<<left<<book->jezyk<<setw(5)<<left<<book->cena<<endl;
return wyj;
}
ifstream& operator>>(ifstream& wej, Ksiazka* book)
{
string temp;
wej>>book->tytul>>book->jezyk>>book->cena;
temp=book->tytul;
for (int i = 0; i < temp.length()+1; ++i)
{
if (temp[i]=='*')
{
temp[i]=' ';
}
}
book->tytul=temp;
return wej;
}
bool Ksiazka::operator==(const double& liczba) const
{
if (cena==liczba)
return true;
return false;
}
bool Ksiazka::operator<=(const double& liczba) const
{
if (cena<=liczba)
return true;
return false;
}
bool Ksiazka::operator>=(const double& liczba) const
{
if (cena>=liczba)
return true;
return false;
}