Klasa zapisująca i odczytująca z pliku.

0

Witam,
Problem mój polega na tym, że tworzę prostą bazę danych. Baza posiada klasę : samochod, oraz dziedziczące po niej klasy osobowy oraz ciężarowy. Teraz pragnę stworzyć klasę która będzie odpowiadała za zapis danych obiektu do pliku i odczyt danych z pliku.
Totalnie nie wiem jak za to się zabrać. Jak ta klasa miałaby wyglądać?
Jakaś pomoc?

Dzięki!

0

a jak mają ​wyglądać rekordy tej bazy danych? (pola klasy)

0

przeladuj operator << dla tych klas. Zrob klase ktora bedzie przyjmowac wskaznik Samochod (polimorfizm) i bedzie wywolywac

myfile << obiekt

dzieki przeladowaniu operatora myfile bedzie wiedzial jak zapisac do swojego pliku.
To samo robisz w druga strone. Musisz pamietac przy odczytywaniu jak zarzadzac nowymi obiektami.
Duzo tu rzeczy pominalem, by Ci nie dawac gotowca. Ale najtrudniejsza rzecz Ci wyjasnilem ;)

Chyba ze chcesz cale obiekty zapisac do pliku (binarnie) to poczytaj o serializacji, mozesz to zrobic za pomoca boosta.

0

o pozwolę sobie na małe wtrącenie. @fasadin a co jak mam n obiektów typu np. Book, trzymam je w vectorze i chcę łatwo ładować/zapisywać to z/do pliku to też myfile << obiekt tyle, że w pętli? Czy może lepiej zrobić sobie do tego osobną klasę z metodami np; vector<Book> FileHelper::getBooks(void) void FileHelper::saveBooks(vector<Record> books) ?
ps tak normalnie użyłabym Boosta, ale to na zaliczenie

0

jezeli chodzi o male projekty to nie ma znaczenia. Jezeli chcesz to zrobic na duza skale to zrobilbym tak

Klasa reprezentuje tabele, kazda klasa ktora ma byc tabela musi dziedziczyc po interfejsie (klasie czysto abstrakcyjnej), ktora wymusza jakis schemat i pomaga w polimofrizmie.
Nadal masz jedna klase, dzieki ktorej zapisujesz do pliku (singleton sie nada, pamietaj zeby go inicjalizowac np w main, samo inicjalizujace sie pole statyczne jest zle ;))
I teraz w tej klasie mozesz zrobic dwie rzeczy
Natychmiastowe zapisywanie czyli po prostu wywolujesz ten obiekt myFile << obiektZTabeli;
Kompleksowe zapisywanie. Dodajesz do kolejki typu queue i wtedy gdy uzyjesz
myFile.saveAll();
idziesz po wszystkich wskaznikach ktore zapisalas i wywoulujesz operator<< tej klasy z obecnym obiektem z kolejki.
Przy czym tez zrobilbym tak by zapisywanie odbywalo w osobnym watku. (pamietaj zeby zabezpieczyc watek tak by do kolekcji inny watek sie nie dostal)

I mozesz uzywac
myFile << obiekt
myfile.saveAll()
zamiennie

Przy czym myfile jest Twoja klasa! (nie obiektem typu istream)

0

@n0name_l

  1. a jak mam np. 3 klasy to dla każdej klasy zrobić to zaprzyjaźnione ostream??
  2. a jak wczytać ??
  3. Gdy się tak zrobi już nie można sobie dodać np. odpowiednika toString z javy tj http://stackoverflow.com/questions/1549930/c-equivalent-of-java-tostring ??
#include <fstream>
#include <iterator>
#include <vector>

using namespace std;

class Book {
private:
	int id;
	string title;
	string author;

	friend ostream& operator<<(ostream& out, const Book& book) {
		return out << book.id << ";" << book.title << ";" << book.author;
	}

	friend istream& operator>>(istream& in, Book& book) {
		string line;
		return in >> line;
	}
public:
	Book() {
		id = -1;
		title = "";
		author = "";
	}
	Book(int _id,string _author, string _title) {
		id = _id;
		title = _title;
		author = _author;
	}
};

int main()
{
    std::vector<Book> books;
    books.push_back(Book(6522456,"Julian Tuwim","Lokomotywa"));
    books.push_back(Book(1478524,"Mario Puzo","Ojciec Chrzestny"));
    books.push_back(Book(9174948,"Bolewsław Prus","Lalka"));

    /* zapisanie do pliku */
    std::ofstream FILE("test.txt", std::ios::out | std::ofstream::binary);
    copy(books.begin(), books.end(), std::ostream_iterator<Book>(FILE,"\n"));

    /* wczytywanie z pliku */
    std::vector<Book> wczytane;
    std::ifstream INFILE("test.txt", std::ios::in | std::ifstream::binary);
    copy(istream_iterator<Book>(INFILE), istream_iterator<Book>(), back_inserter(wczytane));

	return 0;
}
1
  1. Tak.
  2. Tu sie rodza problemy...
    	/*string line;
    	getline(in, line);
    	vector<string> tokens = split(line, '-');
    	if(tokens.size() == 3) {
    		book.id = stoi(tokens[0]);
    		book.title = tokens[1];
    		book.author = tokens[2];
    	}*/
        return in >> book.id >> book.title >> book.author;

Zakomentowany sposob, wczytuje cala linie i rozdziela po -, drugi wczytuje 3 'wyrazy' oddzielone spacja.

  1. Mozna:
    string toString() const {
    	return to_string(id) + ";" + title + ";" + author;
    }

I uzyc np. tak:

    for(const Book& book : wczytane) {
    	cout << book.toString() << "\n";
    }

Ahh tu chodzi o cos innego w 3. Okej.. To jak to wyswietlasz/wczytujesz/whatever zalezy tylko od Ciebie i nie ma jakiejs to narzuconej z gory formy :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1