wczytanie z pliku do wektora ?

0

Witam

Mam problem z którym się troche już głowie...a wiec

powiedzmy mam taka klase :

class Klasa
{
        public :

        int     x,y;
        char    znak;
        string  nazwa;

	Klasa(string name)
	{
		napis = name;
	}

        void zapisz();
        void wczytaj();
};

i wektor klasy

vector <Klasa> v;

oraz funkcje zapisujaca do pliku

```cpp
void Klasa :: zapisz()
{
        ofstream plik ("plik.txt");

        for (unsigned int i=0; i<v.size(); i++)
        {
                plik << v[i].x << endl;
                plik << v[i].y << endl;
                plik << v[i].znak << endl;
                plik << v[i].napis << endl;
        }
        plik.close();
}

I powiedzmy podczas działania programu ilosc wektorów v się zwiekszyła o ileś tam razy i zamykamy program.

I teraz pytanie jak napisać funkcje odczytującą nie znaną ilosc wektorów "w" ?

próbowałem coś z

while (!plik.eof())
{
	// wczytywanie
}

ale słabo działalo ;/

0

Przykładowy kod:

#include <iostream>
#include <string> 
#include <vector> 
#include <fstream>

class Books {
protected:
    struct Book{
        int shelf_no; 
        float rating; // wartości liczbowe mogą być w osobnych liniach lub oddzielone spacjami
        std::string title;// przechowywany koniecznie w osobnej linii! wyciągany za pomoca getline :)
        int pages; // w nowej linii, aby nie stał się częścią tytułu
        
        friend std::ostream& operator<<(std::ostream& os, const Book& book) {
            os << "Book {\n\tshelf_no: " << book.shelf_no
               << "\n\trating: " << book.rating
               << "\n\ttitle: " << book.title
               << "\n\tpages: " << book.pages 
               << "\n}\n";
            return os;
        }
        
        friend std::istream& operator>>(std::istream& is, Book& book) {
            if (is >> book.shelf_no && is.good()) {
                is >> book.rating;
                is.ignore(); // uwaga na znak nowej linii! 
                             //getline mogłoby wypluć pusty string zamiast tytułu :)
                std::getline(is, book.title);
                is >> book.pages;
            }
            return is;
        }
    };

    std::vector<Book> data;
public:
    
    Books(const std::string& filename) {
        std::ifstream file(filename.c_str());
        file >> *this;
    }
    Books() {}
    
    friend std::istream& operator>>(std::istream& is, Books& books) {
        Book book;
        while (is >> book && is.good()) {
            books.data.push_back(book);
        }

        return is;
    }
    
    friend std::ostream& operator<<(std::ostream& os, const Books& books) {
        for (std::vector<Book>::const_iterator cit = books.data.begin(); cit != books.data.end(); ++cit) {
            os << *cit;
        }
        return os;
    }
};

int main() {
    //Books books("books.dat");
    Books books;
    std::cin >> books;
    
    std::cout << books;

    return 0;
}

Przykładowy plik:

1 5.5
Kraina Cieni
120
1 5.2
Ksiaze Zebrakow
67

i przykładowe uruchomienie programu:

$ ./cpp.exe < books.dat
Book {
        shelf_no: 1
        rating: 5.5
        title: Kraina Cieni
        pages: 120
}
Book {
        shelf_no: 1
        rating: 5.2
        title: Ksiaze Zebrakow
        pages: 67
} 
0

zmixowałem te wasze źrodła i dodałem do swojego i działa:)

Dzieki wielkie.

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