Wczytywanie danych obiektu klasy z pliku C++

0

Witam. Problem jest następujący. Mam taką klasę:

class Planety{

protected:
    string masa;
    string sr_gestosc;
    string temp_pow;

public:
    string nazwa;
    Planety(string nazwa, string masa, string sr_gestosc, string temp_pow){
        this->nazwa=nazwa;
        this->masa=masa;
        this->sr_gestosc=sr_gestosc;
        this->temp_pow=temp_pow;
    }

};

i plik Planety.txt z przykładowymi danymi.
Jak wczytać te dane do nowego obiektu?

Próbowałam czegoś takiego:

void stworz_planete(ifstream &plik, Planety planeta){
	plik.open("Planety.txt");
	if(!plik){
		cout<<"blad otwarcia";
		exit(1);
	}
    plik >> planeta;
	plik.close();
}

...

Planety planeta("","","","","");
ifstream plik;
stworz_planete(plik,planeta);

Niestety wywala błąd w linijce: plik >> planeta;

Jak to naprawić?

Z góry dziękuję za pomoc.

0

wewnątrz klasy:
istream &get(istream &s) { return s>>nazwa>>masa>>sr_gestosc>>temp_pow; }
oraz na zewnątrz klasy:
istream &operator>>(istream &s,Planety &P) { return P.get(s); }

0

Hmm, nic to nie zmieniło. Klasę mam w osobnym pliku, a co do tej linijki, która miała być wstawiona poza klasą to mam ją umieścić w main?

0

Najlepiej, jak stworzysz osobną klasę, która będzie odpowiedzialna za tworzenie planet. Wtedy przekazujesz gotowy obiekt (za pomocą stałej referencji ofc) do jej konstruktora i wykonujesz metodę zapisu do pliku - czyli zapisujesz w pliku konkretne dane a nie cały obiekt.

0

Jak pisałam klasę Planety mam w osobnym pliku Planety.h

0

Czy dane w pliku .txt powinny być zapisane w ten sposób:
nazwa masa sr_gestosc temp_pow
tj kolejne stringi oddzielone spacjami.

0

nie ma znaczenia, byleby dane byli oddzielone jednym lub więcej białych znaków: spacja,tabulacja,enter.

0

Czyli chodzi o coś takiego?

class Planety{
 
protected:
    string masa;
    string sr_gestosc;
    string temp_pow;
 
public:
    string nazwa;
    Planety(string nazwa, string masa, string sr_gestosc, string temp_pow){
        this->nazwa=nazwa;
        this->masa=masa;
        this->sr_gestosc=sr_gestosc;
        this->temp_pow=temp_pow;
    }
istream &get(istream &s) { return s>>nazwa>>masa>>sr_gestosc>>temp_pow; }
 
};

I plik main:

void stworz_planete(ifstream &plik, Planety planeta){
        plik.open("Planety.txt");
        if(!plik){
                cout<<"blad otwarcia";
                exit(1);
        }
    plik >> planeta;
        plik.close();
}
 
...
 
istream &operator>>(istream &s,Planety &P) { return P.get(s); } 

Planety planeta("","","","","");
ifstream plik;
stworz_planete(plik,planeta);
0

Ok, kompiluje się ale gdy chcę wyświetlić planetę, jej dane są puste.

0

Wyświetlam je funkcją:

virtual string daneObiektow(){
        string dane;
        dane = nazwa + masa + sr_gestosc + temp_pow + "\n\n\n";
        return dane;
}
0

I sknociłaś*

0

planeta.daneObiektow();

Funkcja jest wewnątrz klasy.

0
cout << planeta.daneObiektow();

ew.

string x = planeta.daneObiektow();
cout << x;

Btw. Czemu nie dodasz do tej klasy:

friend ostream& operator<<(ostream& os, const Planety& p)
{
    return os << p.dana1 << p.dana2 //etc.
}

Zeby to mialo rece i nogi?

0

Słusznie, ale i tak nie wyświetla tych danych.

0

Źle czytasz z pliku dane. Nie mozesz tego zrobić w ten sposób: plik>>planeta. Ale już tak możesz:

vector<string> wektor;

...

while(!plik.eof()){
         plik>>planeta.masa>>planeta.nazwa>>planeta.sr_gestosc>>planeta.temp_pow;
}

Następnie musisz wczytać sczytane dane z pliku do odpowiednich pól w obiekcie. Wtedy możesz z nich korzystać na poziomie obiektu.

0
#ifndef PLANETY_H
#define PLANETY_H
#include <iostream>
#include <string>
#include <vector>
using namespace std;

class Planety{
 
protected:
    string masa;
    string sr_gestosc;
    string temp_pow;
 
public:
    string nazwa;
    Planety(string nazwa, string masa, string sr_gestosc, string temp_pow){
        this->nazwa=nazwa;
        this->masa=masa;
        this->sr_gestosc=sr_gestosc;
        this->temp_pow=temp_pow;
    }

friend ostream& operator<<(ostream& os, const Planety& p){
    return os << p.nazwa << p.masa << p.sr_gestosc << p.temp_pow;
}

istream &get(istream &s) { return s>>nazwa>>masa>>sr_gestosc>>temp_pow; }
    
virtual string daneObiektow(){
        string dane;
        dane = nazwa + masa + sr_gestosc + temp_pow + "\n\n\n";
        return dane;
    }
 
};

istream &operator>>(istream &s,Planety &P) { return P.get(s); }

#endif
0

Możesz pokazać jak to dokładnie ma wyglądać?

0

Pokaz miejsce WYWOLANIA, a jak nie chcesz zrodla udostepniac to przanalizuj to:

#include <iostream>
#include <fstream>
using namespace std;

class Danex
{
	public:
		friend istream& operator>>(istream& is, Danex& d)
		{
			return is >> d.x >> d.y >> d.z;
		}
		friend ostream& operator<<(ostream& os, const Danex& d)
		{
			return os << d.x << endl 
				<< d.y << endl 
				<< d.z << endl;
		}
	private:
		int x;
		int y;
		int z;
};

int main() 
{
	Danex d;
	ifstream in("read.txt");
	in >> d;
	cout << d;
	return 0;
}
0
void stworz_planete(ifstream &plik, Planety planeta){
	plik.open("Planeta.txt");
	if(!plik){
		cout<<"blad otwarcia";
		exit(1);
	}

    plik >> planeta;
	plik.close();
}

//...

Planety planeta("","","","");

ifstream plik;
stworz_planete(plik,planeta);
cout << planeta.daneObiektow() << endl;
0

Działa :) Zrobiłam tak jak w twoim przykładzie :)

0

Wielkie dzięki wszystkim za pomoc ;)

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