ofstream in verschiedenen Funktionen
-
Hallo!
Ich habe hier eine Routine, die Messdaten auf die Platte schreibt. Sie wird nach jeder Messung aufgerufen und sieht so aus:void CKlasseDlg::WriteDataToFile() { ofstream outfile; if (m_iIndex == 1) { // Meßdatei öffnen outfile.open(m_sFile, ofstream::out | ofstream::app); } else if ((m_iIndex-1) % 1000 == 0) {//close and open file every 1000 lines to enforce writing of cached data to disk outfile.close(); // Meßdatei öffnen outfile.open(m_sFile, ofstream::out | ofstream::app); } // Schreiben outfile << m_iIndex << "\t"; outfile << m_dDelta; (...) // Zeilenumbruch in Datei einfügen outfile << "\n"; // Datei schließen outfile.close(); }Das ist schön und gut und funktioniert, ist aber unglaublich langsam. Deshalb wollte ich die Datei offen lassen und nur nach jedem tausendsten Schreiben einmal schließen und wieder öffnen, damit die Daten aus dem cache auf die Platte gespült werden. Das sind Zeilen 4 bis 12.
Jetzt läuft es aber so, dass WriteDataToFile() nur eine Zeile in meine Datei schreibt (die für m_iIndex==1). Ich vermute, das hängt damit zusammen, dass bei jedem Betreten der Funktion das ofstream neu instantiiert wird. Deshalb dachte ich, ich hole mir meinen Datei-handle schon weiter vorne (dort, wo ich in CKlasseDlg::OuterLoop() den Datei-Kopf schreibe), aber ich schaffe es nicht, diesen handle dann an WriteDataToFile() durchzureichen: wenn ich meinen header alsvoid WriteDataToFile(ofstream &outfile);umschreibe, bekomme ich in dieser Zeile einen
error C2061: Syntaxfehler : Bezeichner 'ofstream'
um die Ohren gehauen, und außerdem ein
Überladene Member-Funktion 'void (class ofstream &)' nicht in 'CKlasseDlg' gefunden - siehe Deklaration von 'CKlasseDlg.h'
Das ganze verwirrt mich enorm, weil der ofstream nicht einfach eine Variable zu sein scheint, die ich in meinem Hauptprogramm erzeugen und dann von allen Tochterroutinen aus verwenden kann.
Kann mir da jemand weiterhelfen? Kann man Datei-Zugriff nicht vielleicht insgesamt eleganter erledigen?
Schöne Grüße,
Rufus
-
Hey "rufusD",
wie wärs mit einem Timer oder Multithreading?
-
Vielleicht passiert das #include <fstream> nicht in der CKlasseDialog.h, sondern erst in der CKlasseDialoh.cpp, und deswegen klappts im Header bei der Deklaration der Methode auch noch nicht.
-
Volkard, Du bist mein Held
. Das war schon das ganze Problem. Besten Dank!