In Sekundentakt in Datei schreiben



  • Hi,

    in einem Timer rechne ich jede Sekunde neue Werte aus. Diese möchte ich nun gerne sofort immer in eine Datei schreiben.

    Da der Timer mehrere Tage laufen könnte, halte ich es nicht für sinnvoll the StringList zu nehmen, weil diese nicht soviele Werte aufnimmt und auch der Speicher schnell voll wird.

    Aber jede Sekunde die Datei zu öffnen und dann was ranhängen braucht auch viel Power, vor allem wenn die Datei schon einige MB groß ist.

    Was wäre der beste Weg? Bin auf eure Vorschläge gespannt.

    Martin



  • kannste die datei nicht offen halten und einfach nur anhängen?



  • Das sollte mit einem
    std::vector <Strings> mein_text;
    gehen.
    Dann kannst du dort immer neue Strings anhängen und wenn du fertig bist, das ganze auf die Festplatte schreiben.



  • Hi,

    habe mit std::vector <Strings> mein_text; noch nie gearbeitet, aber das mit dem Datei offen lassen hört sich sehr gut an. Kann ich da vielleicht ein kleines Beispiel bekommen?

    Martin



  • Hallo

    such einfach im C++ Forum nach ofstream.
    Oder in der BCB-Hilfe nach ofstream bzw. basic_fstream.
    Bei lezteren ist auch ein Beispiel dabei.

    bis bald
    akari



  • ich hab die Erfahrung gemacht, dass man zumindest von Zeit zu Zeit die Datei
    schliessen sollte. Wenn du z.B. eine Tagelange Messung machst und irgendwann
    Stromausfall ist / Windows sich beendet / irgend ein anderes Programm auf dem
    Rechner Stress macht, dann war alles umsonst.

    Wenn du die Daten nur an die Datei anhängst benötigt das nicht viel Zeit.



  • Hallo Zusammen,
    Acidmrp hat Recht die Daten können verloren gehen wenn die Datei geöffnet bleibt. Eine andere Möglichkeit du schreibst die Daten in eine Tabelle einer Datenbank. Hier hast du das Problem nicht, dass dir Daten verloren gehen können wenn das Programm oder der Rechner Abstürzt.

    Evi48



  • Martin,

    für so etwas würde ich die Klasse TFileStream empfehlen - sehr einfach zu handhaben und bietet alles, was Du brauchst.
    Ab und zu kannst Du ein FlushFileBuffers ausführen, um die angefallenen Daten wegzuschreiben.



  • @evi48

    ne datenbank ist nichts anderes als ne datei. da kann es auch zu datenverlust kommen. eine datei offen halten ist kein thema, wenn die daten ab und an, wie von meinem vorschreiber erwähnt, in die datei geschrieben werden (flush).

    @Gast#649237

    einen vektor zu verwenden, macht keine sinn, da dort noch viel eher das risiko des datenverlustes auftreten kann.

    macht es überhaupt sinn, sekunden genaue messungen auf nem windoof-rechner auszuführen? mein rechner (eher mein windoof) hat die angewohnheit immer mal den auslagerungsdatei zu säubern und sonst irgendwelches zeugs hin und her zu schaufeln (festplatte rattert häufig ohne das ich auch nur ein programm offen habe)...



  • Hi,

    ich könnte natürlich auch in 1s Takt meine Daten in einer Stringlist speichern und dann un 1-5min Takt dann in die Datei schreiben, wenn das besser ist.

    Nur ist ja immer noch nicht klar welche Lösung dann die beste ist.

    Martin



  • Sunday schrieb:

    ne datenbank ist nichts anderes als ne datei.

    Das ist aber ziemlich vereinfacht betrachtet. Bei Access mag das vielleicht noch annähernd stimmen, aber bei einem ernstzunehmenden DBMS
    ist das mit Sicherheit nicht mehr so.

    Sunday schrieb:

    da kann es auch zu datenverlust kommen.

    Aber viel seltener, da normalerweise ein DBMS z.B. selbst eine Log-Datei mitführt, um bei einem Absturz wieder einen konsistenten Zustand
    zu erreichen. Wir haben mal testweise eine Sybase-Datenbank abgeschossen (indem wir einfach den Stecker gezogen haben), ohne dass dabei
    irgendwelche Daten verlorengingen. Ob Du das mit einer selbstgestrickten Lösung so einfach hinbekommst, wage ich zu bezweifeln.
    Ganz abgesehen von den vielen anderen Vorteilen die Datenbanken bieten.

    Gruß,

    Alexander



  • Hallo
    Sunday hat Recht auf den Windows Timer kannst du dich nicht verlassen wenn du zu einer späteren Auswertung die Zeit benötigst lies die aus dem System aus und schreib sie mit in deine Datei für jeden Datensatz.

    Zum Schreiben in deine Datei kannst du z.B. einen Wechselpuffer aufbauen und einen vollen Block an einen Thread übergeben der den dann in die Datei schreibt. Stört auch deinen Windows Timer aber er käme auch durch.

    Evi48


Anmelden zum Antworten