fstream an Methode übergeben?



  • Hi.

    Kann ich einen fstream, also ne geöffnete Datei, an eine Methode übergeben? Bisher habe ich das ganze so gelöst:

    void Vokabel::abfragen()
    {       fstream datei ("vokabel.txt");
            ...
            datei.close();
    }
    

    Ich möchte aber gerne die Datei in der main-Funktion öffnen und dann der Methode übergeben, falls das gehen sollte.

    Gruß Alex



  • void Klasse::Methode (std::iostream& Stream)
    {
    
    }
    


  • Danke!

    Gruß Alex



  • ne idee waer doch noch

    class Klasse
    {
        private:
            fstream datei;
        public:
            Klasse();
            ~Klasse();
    
            void Abfragen();
    };
    
    Klasse::Klasse()
    {
        datei.open("vokabel.txt");
    }
    Klasse::~Klasse
    {
        if(datei.isopen())
            datei.close();
    }
    void Klasse::Abfragen()
    {
        if(datei.isopen())
        {
            // do something with datei
        }
    }
    

    optional bietet es sich auch an beim instanziieren der klasse den konstruktor noch den string zur datei zu uebergeben

    class Klasse
    {
        private:
            fstream datei;
        public:
            Klasse(std::string);
            ~Klasse();
    
        void Abfragen();
    };
    Klasse::Klasse(std::string FileName)
    {
        datei.open(FileName);
    }
    Klasse::~Klasse
    {
        if(datei.isopen())
            datei.close();
    }
    void Klasse::Abfragen()
    {
        if(datei.isopen())
        {
            // do something with datei
        }
    }
    
    int main()
    {
        Klasse abfragerei("vokabel.txt");
        abfragerei.Abfragen();
        return 0;
    }
    

    wenn man moechte kann man auch den string per parameter angeben

    int main(int argc, char* argv[], char* envp[])
    {
        if( argc <= 1 )
            return -1;
        else
        {
            Klasse abfragerei(*(argv++));
            abfragerei.Abfragen();
        }
        return 0;
    }
    

    // untested



  • Mr Evil schrieb:

    optional bietet es sich auch an beim instanziieren der klasse den konstruktor noch den string zur datei zu uebergeben

    Ein paar Vereinfachungen/Verbesserungen:

    • fstream::open() erwartet (leider) keinen string, sondern einen const char* - den du dir mit c_str() beschaffen mußt.
    • der close() Aufruf im Destruktor ist überflüssig - das erledigt fstream auch selber
    • ich würde da noch eine Methode ergänzen, um die offene Datei später zu wechseln


  • Das ist natürlich ein etwas anderer Ansatz, als vom Frager gefordert. Aber bitte, meinetwegen. Nur dann bitte auch gleich sauber:

    class Klasse
    {
        private:
            std::fstream datei;
        public:
            Klasse(const std::string&);
    
        void Abfragen();
    };
    
    Klasse::Klasse(const std::string& FileName) : datei (FileName) {}
    {
        if (!datei.is_open())
            throw std::runtime_error ("can't open file");
    }
    
    void Klasse::Abfragen()
    {
        // do something with datei
    }
    
    int main()
    {
        Klasse abfragerei("vokabel.txt");
        abfragerei.Abfragen();
        return 0;
    }
    


  • Schon nicht schlecht Z2! 😃 Aber NOCH sauberer wäre es, wenn man gleich boost::filesystem::fstream benutzen würde. Dann würde man nicht mit simplen strings arbeiten, sondern gleich mit path-Objekten, die auch noch eine Pfad-Syntax-Prüfung drin haben. :p



  • immer dieses boost gequatsche q: #gg



  • Na na! Nichts gegen Boost! 😉 Wenn wir "Pech" haben, müssen wir boost::filesystem im TR2 ertragen! 😃 Die Chancen stehen da nicht schlecht, wenn nicht sogar, hat das Komitee innerlich schon zugestimmt. Dann würde das ganze so aussehen:

    using namespace std::tr2;
    try
    {
       path mypath("./readme.txt");
       ifstream f(m<path);
    }
    catch(filesystem_error &e)
    {
       cout << e.what();
    }
    

    Für eine bessere fstream-Welt!!! 🤡



  • Ähm, für was braucht ne vokabelklasse nen fstream member?
    Sollte man da nicht besser eine Load/Save funktion erstellen,
    und die vokabeln entsprechend in einer map<string,string> speichern?

    Und, Artchi, wenn du schon boost nimmst, dann nimm doch gleich boost::spirit,
    dann brauchst du dich auch nicht mehr um das Laden der Datei zu kümmern,
    sonst kannst es direkt in die map rein semmeln lassen :p


Log in to reply