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

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

@galko441

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

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

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