gleichzeitiges Schreiben in Textdatei mit mehreren Anwendungen >> fstream



  • Hallo ihr alle,
    ich habe mal eine allgemeine Frage zu den fstreams in C++.
    Ich möchte eine Funktion schreiben über die verschiedene Programme in die selbe Textdatei einen Log
    schreiben können. Um zu testen ob das generell möglich ist, habe ich zwei Programme in Endlosschleifen
    unterschiedliche Ausgaben in die Datei schreiben lassen. Auf den ersten Blick sieht das auch sehr gut aus.
    Beide Programme scheinen alle Ausgaben, mehr oder weniger gleichberechtigt in die Datei ausgeben zu können. Da ich vorher jedoch mal google angeschmissen hatte um zu suchen, bin ich iwo auf die Aussage gestoßen, dass die Datei in "binary random access mode" geöffnet werden sollte, damit ein "shared access" möglich ist. Aktuell öffne ich die Datei mit dem "append" Modus und es kommt wie gesagt zu ganz guten Ergebnissen.
    Nun meine Frage : Ist es Zufall, dass es bei mir funktioniert und müsste ich hier noch iwas beachten bzw. tatsächlich diesen binary random access mode nutzen, oder ist es so wie ich es mache in Ordnung?

    Hier noch mal mein Code :

    Programm 1 :

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main(){
        int i = 0;
        while(1) {
            i++;
            ofstream myfile;
            myfile.open("test.txt", std::ios_base::app);
            myfile << "xxx - " << i << " - Hello World" << endl;
            myfile.close();
        }
        return 0;
    }
    

    Programm 2 :

    #include <iostream>
    #include <fstream>
    
    using namespace std;
    
    int main(){
        int i = 0;
        while(1) {
            i++;
            ofstream myfile;
            myfile.open("test.txt", std::ios_base::app);
            myfile << "yyy - " << i << " - Hello World" << endl;
            myfile.close();
        }
        return 0;
    }
    

    Über eine Antwort würde ich mich sehr freuen 🙂
    Viele Grüße
    anon1234



  • Wo siehst du in der std::fstream Dokumentation einen "binary random access mode"?



  • Hallo manni, vielen Dank für deine Antwort. Den "binary random access mode" habe ich nirgends finden können. Deswegen habe ich es einfach mit dem append-Modus probiert, da der ja wie ich es haben möchte am Ende der Datei wieder anfängt zu schreiben.
    Ich hab das mit diesem "binary random access mode" nur iwo gelesen und mich gefragt ob es den tatsächlich gibt, bzw. ob ich iwie so etwas, das garantiert, dass nicht eine Anwendung ausgesperrt wird, iwo einbauen muss.



  • Das dürfte wohl nicht mit Funktionen aus dem C++-Standard zu realisieren sein, d.h. du wirst Betriebssystemfunktionen verwenden müssen (falls es für deines überhaupt funktioniert).

    In deinem Beispiel testest du nicht auf Fehler. Unter Windows solltest du aber öfter mal auf einen Fehler treffen, da das gleichzeitige Öffnen in zwei Programmen so nicht möglich ist.



  • hallo manni,
    danke für deine Antwort und deinen Hinweis auf die Fehler bei Windows.
    Das könnte ich dann ja wsl. einfach umgehen in dem ich warte, bis es möglich ist die Datei zu öffnen und
    im Zweifel noch die Exceptions abfange.

    int main(){
        int i = 0;
        while(1) {
            i++;
            ofstream myfile;
            while(!myfile.is_open()) { // wait until it is possible to open file
                myfile.exceptions(ofstream::failbit | ofstream::badbit);
                try {
                    myfile.open("test.txt", std::ios_base::app);
                } catch (ofstream::failure e) {
                    cerr << "Exception : Error during opening file" << endl;
                }
            }
            myfile.exceptions(ofstream::failbit | ofstream::badbit);
            try {
                myfile << "yyy - " << i << " - Hello World" << endl;
                myfile.close();
            } catch (ofstream::failure e) {
                cerr << "Exception : Error during writing / closing file" << endl;
            }
        }
        return 0;
    }
    


  • Hi,

    um gleichzeit in eine Datei zu schreiben wuerde ich

    1. Ein dynamisch Bibliothek erstellen die in den verschiedenen Programmen geladen wird, ueber einen Mutex sichern ( einen der Prozess weit gilt zB. der von der WInAPI) und dan synchronisiert rein schreiben

    2. Einen Log Prozess schreiben zu dem sich die Programme verbinden (Stichwort Inter Process Communication IPC) und an den die Log Nachrichten schicken.


Log in to reply