C++ fstream запис в файл от вектор
Здравейте!
Искам да ви помоля за малко помпощ откъм запис на задачата. Целта е да запиша всички класове ( първоначално мислих да е фукнцията PrintInfo ) чрез fstream в файл. Пробвах няколко начина за които се сетих, но никой не сработи според очакванията. Предполагам, че записа трябва да се случи при функцията Add. Отворен съм за всякакави идеи, критики и съвети.
#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;
};
Благодаря за отговора !
Ето как реших задачата:
1.Създавам глобална променлива
2.Правя виртуална функция
3.В каря на всеки клас добавям запис на данните във файла
4.Дефинирам функцията save/load_File()
Като според ID разпознава кой е класа. Тук съм показал само първия клас.
5.В менюто съм добавил опция запис, която е зададена непосредтвено преди while който отговаря за менюто.
Надявам се да съм помогнал, ако някой има подобен проблем. Благодаря за бързия отговор!
Извинявам се , но може ли целия код на програмата , много ми е нужен.
@galko441
Ако молбата е към мен, нямам решение, защото дори нямам условието на задачата.
Ако имаш конкретен въпрос, ще се радвам да ти отговоря.
Понеже задачата е подобна на мойта .
Тема:
1) Продажба на компютри
///////////////////////////////////////////////
Да има програмно меню за:
- въвеждане на данни
- обработка
- извеждане на резултат
////////////////////////////////////////////////
1) Наличие на КП
2) Добро оформление на загл. стр., описание и смислено съдържание
3) Данните се съхраняват във файлове (fstream)
4) Има поне 3 класа
5) Има смислено наследяване
6) Използван е полиморфизъм
7) Използвани са чисто виртуални функции и абстр. класове
8) Има множествено наследяване
9) Използвани са контейнери (напр. vector)
10) Има обработка на изключения
@galko441
Не вярвам някой тук да ти напише цялата програма - не е това целта на форума, но по-важното е, че това по никакъв начин няма да ти е от полза.
Почни да я пишеш сам - от нещата, които знаеш, а като се сблъскаш с конкретен проблем или имаш конкретен въпрос, може да питаш тук или да потърсиш отговора в интернет (всички смислени въпроси, свързани с програмирането, вече имат отговори на 1-ва страница в google search).
Просто искам към този код да се добави записване чрез fstream същото като в темата. Опитах се и не мога сам да го добавя .. ще съм благодарен ако някой ми помогне. ( Това е целият код)
Колегата @IceMaDaFaKa е дал решението си на този проблем. Тъй като запис/четене на файл е доста общ въпрос, по който има много информация в нета, направо ще ти дам няколко линка, в които има и примери:
Input/output with files
std::ostream::write