Problem mit Binärdateien



  • Hallo, ich habe folgenden Code geschrieben:
    Datei: struct.h:

    #include <stdexcept>
    #include <iostream>
    using namespace std;
    
    struct person
    {
    	string name;
    	string beruf;
    };
    
    class No_File : public exception
    {
    private:
    	string errortext;
    public:
    	virtual const char* what() const
    	{
    		cerr << "Datei nicht vorhanden, Programmabbruch!" << endl;
    		return(errortext.c_str());
    	}
    	No_File()
    	{
    		what();
    	}
    	~No_File(){}
    };
    

    Und diesen:

    #include "struct.h"
    #include <fstream>
    
    using namespace std;
    
    void writeinfile(string file) throw(No_File)
    {
    	ofstream dat_aus;
    	person Anbar;
    	Anbar.beruf = "Katze";
    	Anbar.name = "Anbar";
    	dat_aus.open(file.c_str(), ios_base::out);
    	if(!dat_aus)
    	{
    		dat_aus.close();
    		throw(No_File());
    	}
    	else
    	{
    		dat_aus.write((char *)&Anbar, sizeof(person));
    		dat_aus.close();
    	}
    }
    
    void readfromfile(string file) throw(No_File)
    {
    	ifstream dat_ein;
    	person read_obj;
    	dat_ein.open(file.c_str(), ios_base::in);
    	if (!dat_ein)
    	{
    		throw(No_File());
    		dat_ein.close();
    	}
    	else
    	{
    		//dat_ein.seekg(sizeof(person), ios_base::beg);
    		dat_ein.read((char *)&read_obj, sizeof(person));
    		cout << read_obj.beruf.c_str() <<endl;
    		cout << read_obj.name.c_str() <<endl;
    		dat_ein.close();
    	}
    
    }
    
    void main()
    {
    	try
    	{
    	writeinfile("C:/Dest.anb");
    	}
    	catch(No_File a)
    	{
    		cout << 1 <<endl;
    		return;
    	}
    	try
    	{
    	readfromfile("C:/Dest.anb");
    	}
    	catch(No_File a)
    	{
    		cout << 2 <<endl;
    		return;
    	}
    	/*
    	cout << sizeof(person) << endl;
    	person pers;
    	pers.beruf = "keiner";
    	pers.name = "hans";
    	cout << sizeof(pers) << endl;
    	cout << sizeof(string) << endl;
    	*/
    }
    

    Es funktioniert nicht, entweder wird irgendetwas merkwürdiges ausgegeben, oder der Dateipfad und *???
    kann mir da jemand helfen?

    p.s: Google und Suchfunktion und FAQ benutzt, nichts gefunden.



  • Hallo,

    bin mir nicht mehr sicher, ob es egal ist, ob man beim Pfad ein '\' oder ein
    '/' schreibt, aber versuch dort mal ein 'C:\<file.name>'.

    Uebrigens:

    if (!dat_ein) 
        { 
            throw(No_File()); 
            dat_ein.close(); 
        }
    

    dat_ein.close(); wird hier nie erreicht, da vorher eine exception geschmissen
    wird. Du musst auch den Stream nicht schliessen, denn wenn keine Datei
    geoeffnet worden ist, ist auch kein Stream geoeffnet.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Uebrigens:

    if (!dat_ein) 
        { 
            throw(No_File()); 
            dat_ein.close(); 
        }
    

    dat_ein.close(); wird hier nie erreicht, da vorher eine exception geschmissen
    wird. Du musst auch den Stream nicht schliessen, denn wenn keine Datei
    geoeffnet worden ist, ist auch kein Stream geoeffnet.

    außerdem Resourcenbeschaffung ist Initialisierung-Prinzips

    das problem liegt an

    struct person
    {
        string name;
        string beruf;
    };
    

    ein std::string kann man nicht einfach binär in ein datei schreiben wie du es getan hast, da ein std::string pointer auf speicher in sich hatt, wenn du jetzt std::string roh speicherst dann wird nur diese adresse gespeichert, bei ein zeiten start des programms ist an der adresse aber kein string mehr und deswegen kommt der salat zustande


Anmelden zum Antworten