Професионална програма
Loading...
IceMaDaFaKa avatar IceMaDaFaKa 1 Точки

C++ fstream запис в файл от вектор

Здравейте!
Искам да ви помоля за малко помпощ откъм запис на задачата. Целта е да запиша всички класове ( първоначално мислих да е фукнцията PrintInfo ) чрез fstream в файл. Пробвах няколко начина за които се сетих, но никой не сработи според очакванията. Предполагам, че записа трябва да се случи при функцията Add. Отворен съм за всякакави идеи, критики и съвети. laugh

 

#include "pch.h"
#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;
//=================================================================================================================================================



int countall = 0;


class Tehnika
{
public:
	virtual void print_Info() = 0; 
	virtual double calc_Tax() = 0; 

protected:				
	string marka;
	string model;
	double cena;
	int br;

};
//------------------------------------------------------------------------------------------------------------------------------------------------
class PC : public Tehnika
{
public:
	PC(string ime,string mod, double suma, int broika, int k, int p) {
		marka = ime;
		model = mod;
		cena = suma;
		br = broika;
		kutiq = k;
		per = p;
	} 
	virtual void print_Info() {
		cout << "Марка: " << marka << endl;
		cout << "Модел: " << model << endl;
		cout << "Базова цена: " << cena << endl;
		cout << "Брой: " << br << endl;
		cout << "Тип кутия: " << kutiq;
		if(kutiq ==1 ) cout <<"\t" << "1 - Mini ATX" << endl;
		if (kutiq == 2) cout <<"\t" << "2 - ATX" << endl;
		if (kutiq == 3) cout <<"\t" <<  "3 - XL ATX" << endl;
		cout << "Тип периферия: " << per;
		if (per == 1) cout << "\t" << "1 - Мишка" << endl;
		if (per == 2) cout << "\t" << "2 - Клавиатура" << endl;
		if (per == 3) cout << "\t" << "3 - Мишка и клавиатура" << endl;
		cout << "Крайна цена: " << calc_Tax() << endl;
	}
	virtual double calc_Tax() {
		double cena1=cena*br;
		if (kutiq == 1) cena1 += 20;
		if (kutiq == 2) cena1 += 30;
		if (kutiq == 3) cena1 += 40;
		if (per == 1) cena1 += 20;
		if (per == 2) cena1 += 30;
		if (per == 3) cena1 += 50;
		return cena1;
	}
private:
	double cena;
	int kutiq;
	int per;
};
//-------------------------------------------------------------------------------------------------------------------------------------------------
class Laptopi : public Tehnika
{
public:
	Laptopi(string ime, string mod, double suma, int broika, int in, double t) {
		marka = ime;
		model = mod;
		cena = suma;
		br = broika;
		inch = in;
		teglo = t;
	} 
	virtual void print_Info() {
		cout << "Марка: " << marka << endl;
		cout << "Модел: " << model << endl;
		cout << "Базова цена: " << cena  << endl;
		cout << "Брой: " << br << endl;
		cout << "Размер: " << inch;
		if (inch == 1) cout << "\t" << "1 - 13'" << endl;
		if (inch == 2) cout << "\t" << "2 - 15'" << endl;
		if (inch == 3) cout << "\t" << "3 - 17'" << endl;
		cout << "Тегло: " << teglo;
		cout << endl;
		cout << "Крайна цена: " << calc_Tax() << endl;
	}
	virtual double calc_Tax() {
		double cena1 = cena*br;
		if (inch == 1) cena1 += 0;
		if (inch == 2) cena1 += 100;
		if (inch == 3) cena1 += 200;
		return cena1;
	}
private:
	double cena;
	int inch;
	double teglo;
};
//--------------------------------------------------------------------------------------------------------------------------------------------------
class Tableti : public Tehnika
{
public:
	Tableti(string ime, string mod, double suma, int broika, int g, int u)
	{
		marka = ime;
		model = mod;
		cena = suma;
		br = broika;
		trig = g;
		gps = u;
	} 
	virtual void print_Info() {
		cout << "Марка: " << marka << endl;
		cout << "Модел: " << model << endl;
		cout << "Базова цена: " << cena << endl;
		cout << "Брой: " << br << endl;
		cout << "3G: " << trig;
		if (trig == 1) cout << "\t" << "1 - Има" << endl;
		if (trig == 2) cout << "\t" << "2 - Няма" << endl;
		cout << "GPS: " << gps;
		if (gps == 1) cout << "\t" << "1 - Има" << endl;
		if (gps == 2) cout << "\t" << "2 - Няма" << endl;
		cout << endl;
		cout << "Крайна цена: " << calc_Tax() << endl;
	}
	virtual double calc_Tax() {
		double cena1 = cena*br;
		if (trig == 1) cena1 += 40;
		if (trig == 2) cena1 += 0;
		if (gps == 1) cena1 += 60;
		if (gps == 2) cena1 += 0;
		return cena1;
	}
private:
	double cena;
	int trig;
	int gps;
};
//---------------------------------------------------------------------------------------------------------------------------------------------------
class queueProducts
{
public:
	queueProducts() {};
	void Add(Tehnika * obj) {
		opashka.push_back(obj);
		/*fstream f;
		f.open("d:\\data\\proba1.txt", fstream::out);
		f << opashka;
		*/
		
	}
	void Process() {
		if (opashka.empty()) { //.size==0
			return;
		}
		cout << "Обработка на поръчката:" << endl;
		cout << "Дължимата сума от клиента е " << opashka[0]->calc_Tax() << endl; //-> е за указатели
		opashka.erase(opashka.begin());
		/*fstream f;
		f.open("d:\\data\\proba2.txt", fstream::out);
		for (int i = 0; i < opashka.size(); i++) {
			f << opashka.begin << endl;
		}
		f.close();*/
		::countall;
	}
	void List() {
		cout << "Необработени поръчки:" << endl;
		for (int x = 0; x < opashka.size(); x++) {
			opashka[x]->print_Info();
			cout << endl << "Броя на необработените клиенти е " << opashka.size() << endl;
			fstream f;
			f.open("d:\\data\\proba2.txt", fstream::out);
			f << opashka[x]->print_Info;
			f.close();
		}
		
		
	}
private:
	vector<Tehnika*> opashka;
	
};

 

Тагове:
0
C++ Programming
MartinBG avatar MartinBG 3972 Точки

Като за начало, няма как да използваш тези print_Info() методи за запис към файл, тъй като те са void, т.е не връщат стойност, която да бъде изпратена към файловия стрийм, а директно печатат на конзолата (std::cout).

 

Има много начини да се справиш с този проблем, например:

- Правиш нови методи, които да записват данните във файл, вместо на конзолата, и ги викаш, като им подаваш файла или името му

- Променяш методите да връщат std::string, който да печаташ на конзолата или във файл - според нуждата

- Променяш методите да приемат като параметър std::ostream&, който да използваш за изход вместо фиксирания std::cout, като при нужда ще подаваш или std::cout или std::ofstream

- Овърлоудваш << оператора за твоите класове и подаваш инстанциите им директно към всеки ostream

 

Първите варианти са по-лесни за реализация и съответно по-малко гъвкави, но всеки един би ти свършил работа. Бих ти препоръчал като минимум да се спреш на вариант 2, ако 3 и 4 са ти твърде сложни.

0
IceMaDaFaKa avatar IceMaDaFaKa 1 Точки

Благодаря за отговора !
Ето как реших задачата:
1.Създавам глобална променлива

using namespace std;

fstream f;

class Tehnika

2.Правя виртуална функция

class Tehnika
{
public:
	virtual void print_Info() = 0; 
	virtual double calc_Price() = 0; 
	virtual void save_Info() = 0; 
protected:			

3.В каря на всеки клас добавям запис на данните във файла

virtual void save_Info()
	{
		f << "1;" << marka << ";" << model << ";" << cena << ";" << br << ";" << kutiq << ";" << per << ";" << endl;
	}

4.Дефинирам функцията save/load_File()

void queueProducts::save_File() {
	f.open("data.csv", fstream::out);
	for (int i = 0; i < opashka.size(); i++) {
		opashka[i]->save_Info();
	}
	f.close();
}

void queueProducts::load_File() {
	f.open("data.csv", fstream::in);
	if (!f.is_open()) return;
	string ID, marka, model, cena, br, info1, info2;
	while (!f.eof())
	{
		getline(f, ID, ';');
		if (ID.empty()) continue;
		if (ID == "1") {
			getline(f, marka, ';');
			getline(f, model, ';');
			getline(f, cena, ';');
			double cena1 = stod(cena);
			getline(f, br, ';');
			int br1 = stoi(br.c_str());
			getline(f, info1, ';');
			int info11 = stoi(info1.c_str());
			getline(f, info2, ';');
			int info22 = stoi(info2.c_str());
			cout << "Персонален компютър:" << endl;
			cout << "\t" << "Марка: " << marka << "\t" << "Модел: " << model << "\t" << "Цена: " << cena << "\t" << "Брой: " << br << "\t" << "Тип кутия: " << info1 << "\t" << "Тип периферия: " << info2;
			cout << endl << endl;


			add(new PC(ID, model, cena1, br1, info11, info22));
}
f.close();

Като според ID разпознава кой е класа. Тук съм показал само първия клас.

5.В менюто съм добавил опция запис, която е зададена непосредтвено преди while който отговаря за менюто.

else if (ch == "7") {
			q.save_File();
}

Надявам се да съм помогнал, ако някой има подобен проблем. Благодаря за бързия отговор!

1
galko441 avatar galko441 0 Точки

Извинявам се , но може ли целия код на програмата , много ми е нужен.

0
MartinBG avatar MartinBG 3972 Точки

@galko441

Ако молбата е към мен, нямам решение, защото дори нямам условието на задачата.

Ако имаш конкретен въпрос, ще се радвам да ти отговоря.

0
04/12/2019 21:36:21
galko441 avatar galko441 0 Точки

Понеже задачата е подобна на мойта .

Тема:
1) Продажба на компютри

///////////////////////////////////////////////
Да има програмно меню за:
- въвеждане на данни
- обработка
- извеждане на резултат
////////////////////////////////////////////////
1) Наличие на КП
2) Добро оформление на загл. стр., описание и смислено съдържание
3) Данните се съхраняват във файлове (fstream)
4) Има поне 3 класа
5) Има смислено наследяване
6) Използван е полиморфизъм
7) Използвани са чисто виртуални функции и абстр. класове
8) Има множествено наследяване
9) Използвани са контейнери (напр. vector)
10) Има обработка на изключения
 

0
MartinBG avatar MartinBG 3972 Точки

@galko441

Не вярвам някой тук да ти напише цялата програма - не е това целта на форума, но по-важното е, че това по никакъв начин няма да ти е от полза.

Почни да я пишеш сам - от нещата, които знаеш, а като се сблъскаш с конкретен проблем или имаш конкретен въпрос, може да питаш тук или да потърсиш отговора в интернет (всички смислени въпроси, свързани с програмирането, вече имат отговори на 1-ва страница в google search).

0
galko441 avatar galko441 0 Точки

Просто искам към този код да се добави записване чрез fstream същото като в темата. Опитах се и не мога сам да го добавя .. ще съм благодарен ако някой ми помогне. ( Това е целият код)

#include <iostream>
#include <string>
#include <vector>

using namespace std;

class tax_payer
{
public:
	virtual double calctax() = 0;
	virtual void printinfo() = 0;

protected:
	string id; //reg, adr,ime/egn
};
//================================================
class taxdod : public tax_payer
{
public:
	taxdod(string ime, double suma) {
		id = ime;
		dohod = suma;
	};

	virtual double calctax() {
		return dohod * 0.1;
	};
	virtual void printinfo() {
		cout << "TAX DOD: Ime: " << id << endl;
		cout << "Dohod: " << dohod << endl;
	}

private:
	double dohod;
};
//==================================================
class taxestate : public tax_payer
{
public:
	taxestate(string adres, double suma) {
		id = adres;
		dan_ocenka = suma;
	};
	~taxestate() {};

	virtual double calctax() {
		return dan_ocenka * 0.001;
	};
	virtual void printinfo() {
		cout << "TAX Estate, Adres: " << id << endl;
		cout << "Dan.Ocenka: " << dan_ocenka << endl;
	}

private:
	double dan_ocenka;
};
//===============================================================
class taxcar : public tax_payer
{
public:
	taxcar(string rn, int p, int a, double suma) {
		id = rn;
		power = p;
		age = a;
		base = suma;
	};
	~taxcar() {};

	virtual double calctax() {
		return base;
	};
	virtual void printinfo() {
		cout << "TAX Car, Reg.Nomer: " << id << endl;
		cout << "Power: " << power << " Age: " << age << " Baza: " << base << endl;
	}

private:
	int power, age;
	double base;
};
//============================================================================
class queue
{
public:
	queue() {};
	~queue() {
		vec.clear();
	};

	void add(tax_payer* obj) {
		vec.push_back(obj);
	}
	void list() {
		cout << "Na opashkata sa: " << endl;
		for (size_t i = 0; i < vec.size(); i++)
			vec[i]->printinfo();
	};
	double process() {
		if (vec.empty()) { cout << "Nqma nikoj" << endl; return 0; }
		double danak = vec[0]->calctax();
		cout << "danakoplatec:\n"; vec[0]->printinfo();
		cout << "Danak: " << danak;
		vec.erase(vec.begin());
		return danak;
	};

private:
	vector <tax_payer*> vec;
};

int main()
{
	queue q;
	string s;
	char id = '9';
	double suma;
	int p;
	int a;
	do
	{
		cout << "\n\nMAIN MENU\n1. Tax Car\n2. Tax estate\n3. Tax DOD\n4. Process\n5. List\n0. Exit\n\nChoose: ";
		cin >> id; cin.ignore(10, '\n');
		if (id == '0') return 0;
		else if (id == '1') {
			cout << "Reg. nomer: ";getline(cin, s);
			cout << "Power: "; cin >> p;
			cout << "Age: "; cin >> a;
			cout << "Baza: "; cin >> suma;
			q.add(new taxcar(s, p, a, suma));
		}
		else if (ch == '2') {
			cout << "Adress: "; getline(cin, s);
			cout << "Ocenka: "; cin >> suma;
			q.add(new taxestate(s, suma));
		}
		else if (ch == '3')
		{
			cout << "Ime: "; getline(cin, s);
			cout << "Dohod: "; cin >> suma; cin.ignore(10, '\n');
			q.add(new taxdod(s, suma));
		}
		else if (ch == '4')q.process();

		else if (ch == '5')q.list();





	} while (ch != '0');


}


 

0
04/12/2019 23:58:15
MartinBG avatar MartinBG 3972 Точки

Колегата @IceMaDaFaKa е дал решението си на този проблем. Тъй като запис/четене на файл е доста общ въпрос, по който има много информация в нета, направо ще ти дам няколко линка, в които има и примери:

Input/output with files

std::ostream::write

0