• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ Builder - Problem z odczytem z pliku tekstowego

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
459 wizyt
pytanie zadane 13 września 2015 w C i C++ przez Krawiec91 Pasjonat (19,600 p.)

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;
}


 

1 odpowiedź

0 głosów
odpowiedź 13 września 2015 przez Krawiec91 Pasjonat (19,600 p.)

Plik nagłówkowy klasy Ksiazka:
 

//Definicja klasy Ksiazka
#ifndef KSIAZKA_H
#define KSIAZKA_H
#include <iostream.h>
#include <fstream.h>

class Ksiazka
{
	private:
	string tytul;
	string jezyk;
	double cena;
	public:
	Ksiazka();
	Ksiazka(string Tytul,string Jezyk, double Cena);
	bool operator==(const double& liczba) const;
	bool operator<=(const double& liczba) const;
	bool operator>=(const double& liczba) const;
	friend ostream& operator<<(ostream& wyj, const Ksiazka& book);
	friend istream& operator>>(istream& wej, Ksiazka& book);
	friend ostream& operator<<(ostream& wyj, const Ksiazka* book);
	friend istream& operator>>(istream& wej, Ksiazka* book);
	friend ofstream& operator<<(ofstream& wyj, const Ksiazka& book);
	friend ifstream& operator>>(ifstream& wej, Ksiazka& book);
	friend ofstream& operator<<(ofstream& wyj, const Ksiazka* book);
	friend ifstream& operator>>(ifstream& wej, Ksiazka* book);
};

#endif

 

Podobne pytania

–4 głosów
1 odpowiedź 551 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez bergman Obywatel (1,600 p.)
0 głosów
1 odpowiedź 154 wizyt
0 głosów
1 odpowiedź 224 wizyt
pytanie zadane 30 sierpnia 2015 w C i C++ przez Pomarancza Użytkownik (820 p.)

93,190 zapytań

142,205 odpowiedzi

322,032 komentarzy

62,518 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2817p. - dia-Chann
  2. 2769p. - Łukasz Piwowar
  3. 2759p. - Łukasz Eckert
  4. 2738p. - CC PL
  5. 2704p. - Tomasz Bielak
  6. 2678p. - Łukasz Siedlecki
  7. 2666p. - rucin93
  8. 2485p. - Marcin Putra
  9. 2418p. - Michal Drewniak
  10. 2367p. - Adrian Wieprzkowicz
  11. 2317p. - Mikbac
  12. 2239p. - Michał Telesz
  13. 2156p. - Anonim 3619784
  14. 1733p. - rafalszastok
  15. 1628p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...