Datei öffnen mit einer Funktion



  • Kann man eine Datei mittels einer Funktion öffnen, also z.B.:
    [cpp]
    ifstream DateiÖffnen()
    {
    ifstream filestream("Datei.txt",ios::in)
    return filestream;
    }



  • Probiers aus...


  • Mod

    Jain. Du wirst feststellen, dass du das Streamobjekt nicht kopieren kannst. Du kannst es jedoch natuerlich als Referenzparameter an die Funktion geben und dort oeffnen. Fragt sich nur: Wozu? Normalerweise oeffnet man Dateistreams direkt bei ihrer Erstellung im Konstruktor (sonst wurden sie zu frueh erstellt) und sie schliessen sich automatisch, wenn sie zerstoert werden (sonst leben sie zu lange).



  • SeppJ schrieb:

    Jain. Du wirst feststellen, dass du das Streamobjekt nicht kopieren kannst. Du kannst es jedoch natuerlich als Referenzparameter an die Funktion geben und dort oeffnen. Fragt sich nur: Wozu? Normalerweise oeffnet man Dateistreams direkt bei ihrer Erstellung im Konstruktor (sonst wurden sie zu frueh erstellt) und sie schliessen sich automatisch, wenn sie zerstoert werden (sonst leben sie zu lange).

    Ich habe innerhalb einer switch/case-Anweisung das Abspeichern einer Datei
    erledigt.

    Als ich den nächsten case anlegen wollte, bekam ich die Fehlermeldung:

    crosses initialization of 'std::ofstream filestream'|
    

    Wie ich nachgelesen habe, funktionieren bestimmte Stream-Manipulationen innerhalb einer switch/case Anweisung nicht.
    Da die Streams aber erst in der switch/case Anweisung benötigt werden,
    müssen halt Funktionen die Aufgabe übernehmen.



  • Rabbit2012 schrieb:

    Wie ich nachgelesen habe, funktionieren bestimmte Stream-Manipulationen innerhalb einer switch/case Anweisung nicht.

    Ich behaupt jetzt einfach mal, dass es Quatsch ist. Hab sowas noch nie gehört und kanns mir auch nicht vorstellen. Deinen Compilerfehler behebst du, indem du einen Scope anlegst, also deinen Code in { } einschließt.
    Spricht natürlich auch nichts dagegen, deinen ganzen Code in Funktionen auszulagern, allzuviel würd ich innerhalb eines case Statements nicht machen.



  • Kannst du den Fehler in wenigen (~30) Zeilen kompletten Quelltext zusammenfassen?

    Dann zeig den Quelltext mit Codetags. Codetags siehe unter den Smilies, der erste Button.

    MfG f.-th.



  • class Spieler
    {
      void VektorInDateiSpeichern(ostream &stream,vector<Spieler>&Datensatz);
    };
    
    //Speichert die Teilnehmerliste in eine Datei ab.
    void Spieler::VektorInDateiSpeichern(ostream &stream,vector<Spieler>&Datensatz)
    {
       copy(Datensatz.begin(),Datensatz.end(),ostream_iterator<Spieler>(stream," "));
    }
    
    switch(x)
              {   
                case '7':
                ofstream filestream("Teilnehmerliste.txt",ios::out|ios::app);
                this->VektorInDateiSpeichern(filestream,Datensatz);
                filestream.close();
                MenueAufrufen();        //ruft das Auswahlmenü auf.
                break;
    
                case '8':
                cout<<Sie haben 8 eingegeben.";
                break;
              }
    

    Wenn ich case '8' weglasse, kompiliert der Code ohne Fehler. Den Tip von Mechanics hab ich auch mal ausprobiert, also
    den Anweisungsblock nach case 7 in geschweifte Klammern gesetzt, auch dann kompiliert der Code einwandfrei.


  • Mod

    Und deine Frage dazu ist?



  • Das Programm kompiliert nicht, Fehlermeldungen sind:

    In member function 'void Spieler::MenueAufrufen()
    jump to case label|
    crosses initialization of 'std::ofstream filestream
    

    Deswegen möchte ich das Anlegen des Streams in eine Funktion auslagern,
    weil ich annehme, daß der Fehler dann nicht mehr besteht.
    Ich hatte im I-net gelesen, daß auch bei anderen dieser Fehler auftaucht.


  • Mod

    Die Loesung hat dir doch schon Mechanics gesagt und die Erklaerung, warum das so wie du das moechtest nicht geht, sagt die Fehlermeldung doch selber schon aus. Die Annahme, dass bestimmte Streammanipulationen innerhalb von witch-case nicht funktionieren ist kompletter Bloedsinn, ausser du meinst mit Aktion das Erstellen des Streams mit der Moeglichkeit, dass an der Erstellung vorbeigesprungen wird. Das gilt aber fuer alle Datentypen.


Anmelden zum Antworten