Zapisanie obiektu do pliku

Zapisanie obiektu do pliku
H1
  • Rejestracja:ponad 9 lat
  • Ostatnio:około 7 lat
  • Postów:10
0

Mam problem z zapisaniem wektora do pliku. Kombinowalem troche z przeciazaniem operatorow ale nie wychodzilo mi to tak jakbym chcial. Czy moglby mnie ktos nakierowac co zrobic, zeby po dodaniu obiektu do wektora obiektow, obiekt ten automatycznie byl dopisywany do pliku? Na te chwile w pliku siedzi jeden obiekt, a dodawanie wiekszej ilosci juz sie nie wykonuje.

Kopiuj
#ifndef BOOK_H
#define BOOK_H
#include<string>
#include<vector>
#include<iostream>
#include<fstream>

class book
{
public:
std::string Author, Title;
int Year;
book(){}
book(std::string author, std::string title, int year);
friend struct library;
friend std::ostream& operator<<(std::ostream& out, book const& book);
~book(){}
};

struct library
{
public:
friend class book;
std::vector<book> books;
void add_book(const book& value);
};


#endif // BOOK_H 
Kopiuj
 #include "book.h"

book::book(std::string author, std::string title, int year)
:Author(author), Title(title), Year(year){}

std::ostream& operator<<(std::ostream& out, book const& book)
{
return out<<book.Author<<book.Title<<book.Year;
}

void library::add_book(const book& value)
{
std::fstream file;
file.open("data.txt", std::ios::app);
books.push_back(value);
file<<value;
file.close();
}
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
1
Kopiuj
#include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

class cObj{
    public:
        cObj(string Data1, string Data2, string Data3);
        string sData1;
        string sData2;
        string sData3;
};
cObj::cObj(string Data1, string Data2, string Data3){
    sData1 = Data1;
    sData2 = Data2;
    sData3 = Data3;
}

vector <cObj *> vVector;
int main()
{
    vVector.push_back(new cObj("1", "2", "3"));
    vVector.push_back(new cObj("4", "5", "6"));
    vVector.push_back(new cObj("7", "8", "9"));
    vVector.push_back(new cObj("10", "11", "12"));

    fstream iFile("data.txt", ios::out);
    for(auto &Obj : vVector)
      iFile << Obj->sData1 << " " << Obj->sData2 << " " << Obj->sData3 << "\n";
    iFile.close();
}
 
edytowany 1x, ostatnio: gswidwa
kq
Jaki cel jest tutaj używania nagiego new i zostawiania wycieku pamięci? Pokazanie złych praktyk?
gswidwa
to sie robi w destruktorze zwalnianie pamieci?
kq
No i zwalniasz wskaźniki. Nie zwalniasz pamięci do nich przypisanej.
gswidwa
:O ok ok czaję, w takim razie jaki miałbyś alternatywny kod względem mojego? Bo ja w takim razie robię potworne błędy
kq
Moderator C/C++
  • Rejestracja:prawie 12 lat
  • Ostatnio:3 dni
  • Lokalizacja:Szczecin
4
Kopiuj
class cObj{
    public:
        cObj(string Data1, string Data2, string Data3);
        string sData1;
        string sData2;
        string sData3;
};
cObj::cObj(string Data1, string Data2, string Data3){
    sData1 = Data1;
    sData2 = Data2;
    sData3 = Data3;
}
 
vector <cObj> vVector;
int main()
{
    vVector.emplace_back("1", "2", "3");
    vVector.emplace_back("4", "5", "6");
    vVector.emplace_back("7", "8", "9");
    vVector.emplace_back("10", "11", "12");
 
    fstream iFile("data.txt", ios::out);
    for(auto &Obj : vVector)
      iFile << Obj.sData1 << " " << Obj.sData2 << " " << Obj.sData3 << "\n";
}

edytowany 1x, ostatnio: kq
gswidwa
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 5 lat
  • Postów:839
0

Cholera ...

pingwindyktator
  • Rejestracja:ponad 12 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Kraków
  • Postów:1055
2

@gswidwa Jeszcze inna uwaga: niepotrzebny Ci ten user-defined-ctor. Definiując go nie korzystasz z możliwości generowania wielu rzeczy przez kompilator bo Twoja struktura nie jest wtedy PODem. Rozumiem, że to przykład ale imo dobra praktyka jest robienie PODow tam gdzie się da. Do poczytania http://en.cppreference.com/w/cpp/concept/PODType


do not code, write prose
edytowany 1x, ostatnio: pingwindyktator
gswidwa
Dziękuję ślicznie za podpowiedz i link ☺

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.