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