fstream schreiben klappt nicht ganz



  • Hi, möchte aus einem vektor der klassen archiviert, immer die variable "name" in eine datei schreiben. bei der Zeile, die mit "output.write" anfängt, stoppt der debugger, warum? habe mir nach dem debuggen die kundendaten.txt angeschaut und da werden die Namen gespeichert. allerdings nicht nur, bei 2 einträgen sieht das so aus:

    (P! name1 ÍÍÍÍÍÍÍÍÍ      ÍÍÍÍ°J! name2 ÍÍÍÍÍÍÍÍÍÍÍ      ÍÍÍÍ
    

    wo ist der fehler?

    void kundendatenspeichern () {
    			vector<kunde>:: iterator i;
    			ofstream output ("kundendaten.txt", ios::binary);
    		for (i=kundenliste.begin();i!=kundenliste.end();i++) {
    			output.write ((char*) &i->name, sizeof (i->name));
    		}
    		output.close();
    	}
    


  • output<<i->name;
    

    und lass das binary weg.



  • Danke für die Antwort, andere Frage: ich möchte alle Membervariablen durch eine Funktion in eine Datei schreiben. Ich dachte an das folgendes: Code 2 spricht Code 1 an.

    fehleranzeige:
    error C2248: "std::basic_ios<_Elem,_Traits>::basic_ios": Kein Zugriff auf private Member, dessen Deklaration in der std::basic_ios<_Elem,_Traits>-Klasse erfolgte.

    Werde draus nicht schlau..

    Klasse die sich im Vektor der Klasse (2ter Code) befindet:

    void schreibedaten (ofstream x) {
    		cout <<"Kundendaten von Kunden ID: " << id << " werden gesichert.";
    		x << "Name: " << name << endl;
    		x << "Kontostand: " << cash << endl << endl;
    	}
    

    Klasse die den Vektor beinhaltet und anspricht:

    void kundendatenspeichern () {
    				vector<kunde>:: iterator i;
    				ofstream output ("kundendaten.txt");
    		for (i=kundenliste.begin();i!=kundenliste.end();i++) {
    			i->schreibedaten(output);
    		}
    		output.close();
    	}
    


  • Ach ja Funktionen sind beide in Public und wenn ich die Membervariablen testweise in Public verschiebe ändert sich die Fehlermeldung nicht.



  • Ah noch was, bin an gängigeren Vorgehensweisen sehr interessiert.



  • Du versuchst, deinen ofstream zu kopieren. Das geht nicht.



  • AnfängerPlusPlus schrieb:

    fehleranzeige:
    error C2248: "std::basic_ios<_Elem,_Traits>::basic_ios": Kein Zugriff auf private Member, dessen Deklaration in der std::basic_ios<_Elem,_Traits>-Klasse erfolgte.

    Das ist nicht die vollständige Fehlermeldung.
    Wie schon gesagt, der Fehler ist, dass du versuchst den Stream zu kopieren.
    Um Kopien zu verhindern, wurde vor C++11 die entsprechende Memberfunktion privat deklariert.
    Der Compiler sagt dir nun, dass du eine private Funktion nicht aufrufen darfst.



  • An Leute mit dem selben Problem:
    Die Antwort sind Zeiger.



  • AnfängerPlusPlus schrieb:

    An Leute mit dem selben Problem:
    Die Antwort sind Zeiger.

    Eher micht



  • was dann



  • AnfängerPlusPlus schrieb:

    An Leute mit dem selben Problem:
    Die Antwort sind Zeiger.

    Nimm lieber Referenzen.

    class xyz
    {
        public:
        ostream &toStream( ostream &str ) const
        {
            return str << member1  << member2; // etc
        }
    };
    
    inline ostream &operator << ( ostream &str, const xyz &obj )
    {
        return obj.toStream( str );
    }
    
    ...
    
        xyz obx = <was auch immer>
    
        ofstream datei( "datei.txt" );
    
        datei << obj;
    

    Nur ein Codefragement, Tippfehler bitte selber korigieren. Man könnte den operator auch als friend deklarieren, oder getterfunktionen aufrufen und damit toStream ersetzen. friend benutze ich aber nur, wenn's unbedingt sein muß.

    mfg Martin



  • Warum lieber referenzen?



  • AnfängerPlusPlus schrieb:

    Warum lieber referenzen?

    Hausaufgabe: Schreibe das Beispiel von mir um, indem Du statt Referenzen Zeiger benutzt.



  • Ich meine bezogen auf mein Beispiel



  • AnfängerPlusPlus schrieb:

    Ich meine bezogen auf mein Beispiel

    Das gilt auch bezogen für dein Beispiel.



  • Und wo ist hier das Problem?

    #include <iostream>
    
    using namespace std;
    
    int addition () {
    	int hallo = 1;
    	int tschuss = 2;
    	return hallo << tschuss;
    }
    
    int main () {
    
    	int zahl1 = 0,
    	int zahl2 = 0;
    	zahl1, zahl2 = addition ();
    
    	cout << zahl1 << endl << zahl2 << endl;
    
    	system ("PAUSE");
    
    }
    


  • angenommen das , hinter zahl 1 wäre ein semikolon. statt der ausgabe 1,2 kommt 0,4



  • AnfängerPlusPlus schrieb:

    angenommen das , hinter zahl 1 wäre ein semikolon. statt der ausgabe 1,2 kommt 0,4

    Warum statt?



  • AnfängerPlusPlus schrieb:

    angenommen das , hinter zahl 1 wäre ein semikolon. statt der ausgabe 1,2 kommt 0,4

    lies bitte ein Grundlagenbuch und stochere hier nicht rum.

    mfg Martin


Log in to reply