ifstream zurückgeben



  • Ich wollte gerade eine Methode schreiben mit deren Hilfe ich ifstream objekte zurückgeben kann, eine Art outsourcing für mein aktuelles Projekt in dem ich sehr oft daten Speicher bzw Lade. Allerdings meint mein Compiler ich würde auf Private Member zugreifen, was ich mir allerdings nicht erklären kann:

    ifstream Read::read_file()
    {
    	try{
    	std::cout << "Bitte geben sie den kompletten Datei Pfad an: ";
    	string file_path;
    	cin >> file_path;
    	ifstream input_file(file_path.c_str());
    	if(!input_file) throw "Datei konnte nicht geoeffnet werden";
    	return input_file;
    	}
    	catch(char* str)
    	{
    		cout << str << endl;
    		//set_flag(false);
    		system("PAUSE");
    		read_file();
    	}
    }
    

    danke für die Hilfe.



  • Darf man std::ifstreams überhaupt kopieren?
    Gib doch mal eine Referenz zurück.



  • Wenn du dir genau anschaust, was das für provate Member sind sollte es klingeln.
    Tip: ifstream ist nicht kopierbar! Dies realisiert man dadurch, dass man Kopierkonstruktor und Zuweiseungsoperator private deklariert.
    Versuch das lieber ordentlich zu erledigen, z.B. indem du eine Referenz auf ein ifstream übergibst.

    BTW:
    Dein Einsatz von Exceptions grenzt ja schon an Vergewaltigung...



  • Danke für den Aufmunternden Kommi bezüglich meiner Exceptions 😃

    Hmm, aber wenn ich eine Referenz aus einer Methode zurück gebe? Was garantiert mir das die Speicherzelle nicht gelöscht wird sobald die Methode und damit das eigtl Ifstream Objekt beendet ist? Oder verhält sich die Lebenszeit von lokalen Variablen anderns wenn man Referenzen übergibt? Das kenn ich so eigtl wenn nur von Java.



  • Jud4s schrieb:

    Danke für den Aufmunternden Kommi bezüglich meiner Exceptions 😃

    Hmm, aber wenn ich eine Referenz aus einer Methode zurück gebe? Was garantiert mir das die Speicherzelle nicht gelöscht wird sobald die Methode und damit das eigtl Ifstream Objekt beendet ist? Oder verhält sich die Lebenszeit von lokalen Variablen anderns wenn man Referenzen übergibt? Das kenn ich so eigtl wenn nur von Java.

    Stimmt schon, eben nicht mitgedacht. Ich persönlich würde soetwas basteln:

    std::ifstream& read_file(std::ifstream& in)
    {
        //Code
        return in;
    }
    


  • Jud4s schrieb:

    Danke für den Aufmunternden Kommi bezüglich meiner Exceptions 😃

    Bitte :p
    Dir ist hoffentlich klar, dass eine Exeption hier absolut unnötig ist. Du wirfst sie nur um sie gleich wieder zu fangen. Das geht auch gleich ohne Exception 😉

    Hmm, aber wenn ich eine Referenz aus einer Methode zurück gebe? Was garantiert mir das die Speicherzelle nicht gelöscht wird sobald die Methode und damit das eigtl Ifstream Objekt beendet ist? Oder verhält sich die Lebenszeit von lokalen Variablen anderns wenn man Referenzen übergibt? Das kenn ich so eigtl wenn nur von Java.

    Speicher wird gelöscht, wenn das funktiniert hattest du Glück...
    Mach es mit einer Referenz als PARAMETER

    void open_file( std::ifstream& file ) {
        std::cout << "Bitte geben sie den kompletten Datei Pfad an: ";
        string file_path;
        cin >> file_path;
        file.open(file_path.c_str());
    }
    
    int main()
    {
        ifstream file;
        open_file(file);
    }
    


  • Icematix schrieb:

    Darf man std::ifstreams überhaupt kopieren?

    Nein.
    Referenzen sind der übliche Weg.



  • Oder wenn du aus irgendeinem Grund unbedingt den Rückgabetypen benutzen willst:

    std::auto_ptr<std::ifstream> read_file();
    

    (Nicht, dass das wahnsinnig sinnvoll wäre, aber um mal die Möglichkeit genannt zu haben.)



  • Nexus, dann mußt du aber auch darauf hinweisen, daß man dann den 'ifstream' in der Funktion mit new anlegen muß.
    (Persönlich wende ich aber auto_ptr nur innerhalb einer Funktion bzw. intern innerhalb einer Klasse an - nicht als public Rückgabewert - dafür gibt es bessere Wrapper-Klassen).

    Und Jud4s:
    du solltest die Ein- bzw. Ausgabe (IO) und die Daten trennen.
    Gebe daher besser die Datenstruktur zurück und überlasse das Einlesen der Datei einer internen Funktion.


Anmelden zum Antworten