Tworzenie obiektu z pliku txt

0

Witam pisze program na zajęcia, w którym na podstawie pliku tekstowego (coś w rodzaju bazy danych) chcę utworzyć zawartość kontenera. Znaczy kontener vector zawiera wskaźniki na obiekty klasy, a te obiekty tworzę z pliku tekstowego. Oczywiście chcę też móc dopisywać do pliku i kasować z pliku. Może kod lepiej zobrazuje o co mi chodzi:

main:

#include "bureau.h"

#include <iostream>

int main()
{
    std::cout << "Hello World!" << std::endl;
    Bureau *bureau = new Bureau();
    bureau->load_cars_from_txt();
    bureau->show_cars();
    delete bureau;
    return 0;
}
 

Vehicle.h :

 #ifndef VEHICLE_H
#define VEHICLE_H

#include <string>

class Vehicle
{
    friend class Bureau;
private :
    static int id;
    int year;
    std::string marque, model;
    double price;
public:
    Vehicle();
    Vehicle(int, std::string, std::string, int, double);
    ~Vehicle();
    std::string to_string();
};

#endif // VEHICLE_H

Vehicle.cpp :

 #include "vehicle.h"
#include <iostream>
#include <sstream>

int Vehicle::id = 1;

Vehicle::Vehicle()
{
}

Vehicle::Vehicle(int id, std::string marque, std::string model, int year, double price)
{
    this->id = id;
    this->marque = marque;
    this->model = model;
    this->year = year;
    this->price = price;
}

Vehicle::~Vehicle()
{
}

std::string Vehicle::to_string()
{
    std::stringstream ss;
    std::string strings;
    ss << id << " " << marque << " " << model << " " << year << " " << price;
    strings = ss.str();
    return strings;

}

Bureau.h :

#ifndef BUREAU_H
#define BUREAU_H

#include "vehicle.h"

#include <vector>

class Bureau
{
private:
    std::vector <Vehicle*> cars;
    Vehicle *car;
public:
    Bureau();
    ~Bureau();
    void load_cars_from_txt();
    void add_car();
    void show_cars();

    friend class Vehicle;
};

#endif // BUREAU_H
 

Bureau.cpp :

#include "bureau.h"
#include "vehicle.h"

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

using std::cout;
using std::cin;
using std::endl;
//std::vector <Vehicle*> cars;
std::ofstream out;
std::ifstream in;

Bureau::Bureau()
{
    //load_cars_from_txt();
}


Bureau::~Bureau()
{
    cout << "Game Over!" << endl;
}

void Bureau::load_cars_from_txt()
{
    in.open("data.txt", std::ios::in);
    std::stringstream ss;
    int id, year;
    std::string marque, model, strings;
    double price;
    do
    {
        getline(in, strings);
        ss << strings;
        ss >> id >> marque >> model >> year >> price;
        ss.clear();
        //cout << numer << naz << endl;
        car = new Vehicle(id, marque, model, year, price);
        cars.push_back(car);
    } while (!in.eof());
    //samochody.erase(samochody.begin());
    cars.pop_back();
    in.close();
}

void Bureau::add_car()
{
    int id, year;
    std::string marque, model;
    double price;
    out.open("data.txt", std::ios::out | std::ios::app);
    std::ostream & seekp(std::streamoff eof);
    cout << "Podaj marke: ";
    cin >> marque;
    cout << "Podaj model: ";
    cin >> model;
    cout << "Podaj rok: ";
    cin >> year;
    cout << "Podaj cene: ";
    cin >> price;
    cout << endl;
    id = cars.size() + 1;
    out << id << " " << marque << " " << model << " " << year << " " << price;
    //cout << nr << " " << naz << endl;
    car = new Vehicle(id, marque, model, year, price);
    cars.push_back(car);
    std::ostream & seekp(std::streamoff eof);
    out.close();
}

std::ostream &operator << (std::ostream &os, Vehicle &u) {
    return os << u.to_string();
}

void show_cars()
{
    for (size_t i = 0; i < cars.size(); i++)
    {
        cout << *(cars[i]) << endl;
    }
}

 

Problem pojawia się w metodzie

show_cars

, kompilator wywala mi błąd, że nie ma cars

 znaczy kontenera. Ale dlaczego?
0

ale dlaczego jedna metoda nie działa a druga działa? Gdzie mam obiekty globalne? Przejrzałem kod i nie mogę znaleźć

1
void Bureau::show_cars()
{
    for (size_t i = 0; i < cars.size(); i++)
        cout << *(cars[i]) << endl;
}
0
void show_cars()
{
    for (size_t i = 0; i < cars.size(); i++)
    {
        cout << *(cars[i]) << endl;
    }
}

To jest funkcja - nie metoda klasy Bureau!

0

Kardynalny błąd zrobiłem... Dzięki wam. Program się kompiluje, jednak po odpaleniu nic się nie dzieje oprócz "hello word" czyli nie wczytało pliku tekstowego. Program tworzę pod qt i plik umieściłem w folderze projektu...

0

Albo kod albo do wróżbitów.

0

Kod jest u góry. Jedynie zmieniłem

void show_cars() 

na void Bureau::show_cars()

Problem ten mam przy użyiu qt. W visualu 2013 uruchamia się bez problemu. Kontynuowałbym w visualu jednak na zajęciach używamy qt...
0

Gdy plik wrzucę do folderu release i odpalę przez exe to działa, a gdy przez kompilator próbuję otworzyć to nie :/

0

Nie mam problemu z visualem, tylko z qt. Gdy plik wrzucę na C i dam ściężkę : "C:\data.txt" to działa ale jak już przeniosę na inny dysk to nie... Nie rozumiem czemu

0

Problem jest dokładnie ten sam, wyświetl sobie bieżący folder.

0

Nie mam pojęcia w jaki sposób to zrobić... folder projektu zawiera razem pliki nagłówkowe i źródłowe... qt tworzy dotego oddzielnie poza projektem katalogi release i debug... nie wiem już sam :/

0

widziałem możliwość użycia bibliotek qt, tylko wtedy czy program będzie "przenośny" ? Chodzi o to, że mamy pisać programy tak aby można je było odpalić bez względu na kompilator... dlatego najpierw sprawdzam w visualu

0

C/C++ nie mają w standardzie prac z folderami. Więc musisz do tego celu użyć jakichś bibliotek, może boost

0

ale nadal nie rozumiem czemu visual nie ma problemu z plikiem a qt nie potrafi go otworzyć z miejsca projektu

0

Ponieważ IDE ma prawo ustawić bieżący folder tak jak temu IDE się podoba.

0

Ok... Znalazłem kod w dokumentacji boost http://www.boost.org/doc/libs/1_34_0/libs/filesystem/doc/index.htm jednak mam problem już na początku. Jak dodać boost do projektu?

0

ok dzięki... zabieram się za lektury

0

Wytłumacz mi czemu chcesz na chwile wyświetlić sobie bieżący folder przy odpaleniu przez IDE przenośnie?
To jest po to aby sobie raz zobaczyć nawet nie koniecznie w tym twoim projekcie, zanotować sobie i stworzyć w pewnym miejscu shortcut do folderu z danymi.

0

Nie chcę wyświetlać.... chcę tylko sprawić żeby mój plik był sobie odczytywany z folderu projektu bez względu gdzie ten folder będzie

0

Aby to sprawić musisz znać zasadę gdzie IDE ustawia bieżący folder, aby tego dokonać szukasz w google albo w 2 min wyświetlasz w pierwszy lepszy sposób i sam odkrywasz tą zasadę.

0

Już wiem... pliki są w katalogu release lub debug w zależności co się wybrło przy kompilacji.... Tylko jak to teraz zrobić żeby wykładowca dostał bo przecież katalogu release mam nie dawać tylko katalog z plikami źrółowymi i nagłówkami

0

Wykładowca nie będzie odpalać pod debugerem.

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