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