Професионална програма
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 4432 Точки

Като за начало, няма как да използваш тези 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 4432 Точки

@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 4432 Точки

@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 4432 Точки

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

Input/output with files

std::ostream::write

0
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.