Przeciążony operator >> i wczytywanie z pliku

0

Witam, piszę sobie taki mały programik, by jeszcze lepiej ogarnąć przeciążenia operatorów i napotkał mnie błąd.

O ile operatora << ładnie zapisuje mi do pliku to wczytywanie nie idzie już tak gładko, wywala mi błąd:
'binary '>>': no operator found which take a left-hand'...

kawałek kodu:

	friend ostream& operator<<(ostream &os, const silnik &s) {
                os << s.moc<< ' ' << s.wymiary<< ' '<< endl;
                return os;
        }

        friend istream& operator>>(istream &is, silnik &s){
                is >> s.moc >> s.wymiary;
                return is;
        }

// wypiswanie listy

	wsk = glowa;

	while(wsk!=NULL){
		wsk->wypisz();
		lista << (*wsk);
		wsk = wsk->nast;
	}
	
	wsk = glowa;

	lista.close();

// odczytywanie z pliku -  TU KOMPILATOR SIĘ CZEPIA !!! 

	lista.open("lista.txt", ios::in);

	wsk = glowa;

	while(!lista.eof()) {
		lista >> (*wsk);
		wsk = wsk->nast;
    }

	lista.close();
0

powinno być

lista >> wsk

0

niestety nie, tez probowalem tak, ten sam blad nadal sie pojawia

error C2678: binary '>>' : no operator found which takes a left-hand operand of type 'std::ofstream' (or there is no acceptable conversion)
could be 'std::istream &operator >>(std::istream &,silnik &)' [found using argument-dependent lookup]

0

Przecież kompilator wyraźnie mówi co jest źle. Spójrz na wykres dziedziczenia klas <iostream>:

user image
(http://www.cplusplus.com/reference/iostream/)

lista jest typu ofstream czyli jest to wyjściowy strumień plikowy. operator>> oczekuje istream czyli strumienia wejściowego. Z tego powodu musisz użyć jakiegoś strumienia, który dziedziczy istream - na wykresie widać, że może to być albo ifstream albo fstream.

0

Kurcze strasznie to skomplikowanie napisane.. Zatem nie ma błędu w użyciu tego operatora ( lista >> (*wsk); ) , a w napisaniu go? zamiast istream, napisac fstream? nie mam zadnego pomyslu...

0

Operator jest dobrze, lista jest nie tego typu co ma być - nie możesz czytać ze strumienia wyjściowego, to musi być strumień wejściowy albo wejściowo/wyjściowy. Krótko mówiąc: lista jest złego typu.

0
int main(){

	ofstream lista;
	fstream lista_odczyt;
	lista.open("lista.txt", ios::out);

// tworzenie listy

....

// wypiswanie listy

	wsk = glowa;

	printf("\n\n Odczyt listy:\n");

	while(wsk!=NULL){
		wsk->wypisz();
		lista << (*wsk);
		wsk = wsk->nast;
	}
	
	wsk = glowa;

	lista.close();

// odczytywanie z pliku 

	lista.open("lista.txt", ios::in);

	wsk = glowa;

	printf("\n\n Odczyt listy z pliku:\n");

	while(!lista.eof()) {
		lista_odczyt >> (*wsk);
		wsk = wsk->nast;
    }

	lista.close();

ladnie sie kompiluje, ale nadal nie czyta z pliku listy i nie wypisuje jej. :/

0

Zagalopowałem się i zapomniałem zamienić w potrzebnych miejscach lista_odczyt, ale i tak nic to nie pomaga. Nadal kompiluje, ale nie działa..

// odczytywanie z pliku 

	lista_odczyt.open("lista.txt", ios::in);

	wsk = glowa;

	printf("\n\n Odczyt listy z pliku:\n");

	while(!lista_odczyt.eof()) {
		lista_odczyt >> (*wsk);

		wsk = wsk->nast;
    }

	lista_odczyt.close();
0

Nadal nie działa, może komuś kiedyś się przyda, może ktoś pomoże mi bardziej dzięki temu.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cstring>
#include <conio.h>
    using namespace std;


	class silnik{

	protected:
		int moc;
		int wymiary;
	public:
			silnik *nast;

		// konstruktor domyslny
		silnik(): moc(0), wymiary(0), nast(NULL){
		};

		//konstruktor kopiujacy
		silnik(silnik &kopia): moc(kopia.moc), wymiary(kopia.wymiary), nast(NULL){
		};

		//konstruktor przechowujacy
		silnik(int moc1, int wymiary1): moc(moc1), wymiary(wymiary1), nast(NULL){
		};

		friend ostream& operator<<(ostream &os, const silnik &s) {
                os << s.moc<< ' ' << s.wymiary<< ' '<< endl;
                return os;
        }

        friend istream& operator>>(istream &is, silnik &s){
                is >> s.moc >> s.wymiary;
                return is;
        }
		void wypisz(){
			printf("Moc silnika: %d, Wymiar:%d.\n", moc, wymiary);
		}
	};

int main(){

	ofstream lista;
	fstream lista_odczyt;
	lista.open("lista.txt", ios::out);

// tworzenie listy

	silnik *glowa= NULL;
	silnik *wsk = NULL;

	glowa = wsk = new silnik(1,2);

	wsk->nast = new silnik(3,444);
	wsk = wsk->nast;
	wsk->nast = new silnik(5,6);
	wsk = wsk->nast;
	wsk->nast = new silnik(7,8);

// wypiswanie listy

	wsk = glowa;

	printf("\n\n Odczyt listy:\n");

	while(wsk!=NULL){
		wsk->wypisz();
		lista << (*wsk);
		wsk = wsk->nast;
	}
	
	wsk = glowa;

	lista.close();

// odczytywanie z pliku 

	lista_odczyt.open("lista.txt", ios::in);

	wsk = glowa;

	printf("\n\n Odczyt listy z pliku:\n");

	while(!lista_odczyt.eof()) {

		lista_odczyt >> (*wsk);
		wsk = wsk->nast;
    }

	lista_odczyt.close();

// usuwanie listy

	while(wsk!=NULL){
		silnik* tmp = wsk;
		wsk = wsk->nast;
		delete tmp;
	}

	return 0;
}
0
        wsk = glowa;
        printf("\n\n Odczyt listy z pliku:\n");
        while(lista_odczyt >> (*wsk)) wsk=wsk->nast;

Tak a propos czy nie powinieneś zwolnieć całej listy zaś przy odczycie przydzielać pamięć na dokładnie tyle ile jest zapisano w pliku a nie tyle ile przed chwilą zapisałeś?

0

Wszystko wyglada juz ladniej, nadal jednak nie wyswietla w konsoli elementow z pliku.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <cstring>
#include <conio.h>
    using namespace std;

	class silnik{

	protected:
		int moc;
		int wymiary;
	public:
			silnik *nast;

		// konstruktor domyslny
		silnik(): moc(0), wymiary(0), nast(NULL){
		};

		//konstruktor kopiujacy
		silnik(silnik &kopia): moc(kopia.moc), wymiary(kopia.wymiary), nast(NULL){
		};

		//konstruktor przechowujacy
		silnik(int moc1, int wymiary1): moc(moc1), wymiary(wymiary1), nast(NULL){
		};

		friend ostream& operator<<(ostream &os, const silnik &s) {
                os << s.moc<< ' ' << s.wymiary<< ' '<< endl;
                return os;
        }

        friend istream& operator>>(istream &is, silnik &s){
                is >> s.moc >> s.wymiary;
                return is;
        }

		void wypisz(){
			printf("Moc silnika: %d, Wymiar:%d.\n", moc, wymiary);
		}
	};

int main(){

	ofstream lista;
	fstream lista_odczyt;
	lista.open("lista.txt", ios::out);

// tworzenie listy

	silnik *glowa= NULL, *wsk = NULL;

	glowa = wsk = new silnik(1,2);

	wsk->nast = new silnik(3,444);
	wsk = wsk->nast;
	wsk->nast = new silnik(5,6);

// wypiswanie listy

	wsk = glowa;

	printf("\n\n Odczyt listy:\n");

	while(wsk!=NULL){
		wsk->wypisz();
		lista << (*wsk);
		wsk = wsk->nast;
	}
	
	wsk = glowa;

	lista.close();

// odczytywanie z pliku 

	lista_odczyt.open("lista.txt", ios::in);

	wsk = glowa;

	printf("\n\n Odczyt listy z pliku:\n");

	while(lista_odczyt >> (*wsk)){
		wsk=wsk->nast;
	}

	lista_odczyt.close();

// usuwanie 

	delete glowa;

	getch();
	getch();
}
0

wsk->nast = new silnik(5,6);
wsk = wsk->nast;
wsk->nast = NULL;

// wypiswanie listy

0

co to zmienia, ustawienie wskaznika? nic. nadal nie wypisuje listy z pliku, nie mam pojecia gdzie blad, grzebie i grzebie w tym

0

Moment, przecież po zapisie do pliku odczytujesz rekordy w miejsca tych co już miałeś wcześniej i nić więcej z tym nie robisz. Więc nie bardzo rozumiem w czym grzebiesz.

0

okej, dziękuje wszystkim bardzo serdecznie, bardzo mi pomogliście, udało się wszystko zrobić, dobranoc ;)

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