ofstream... speichert hier nur ein Zeichen!?



  • Hallo,
    habe leider mal wieder ein Problem, dass ich mir nicht erklären kann.

    Hier ein Auschnitt meines Quelltextes:

    void __fastcall TForm1::BeendenClick(TObject *Sender)
    {
      ofstream iniOut(inipfad.c_str(),ios::out);
      iniOut <<openmotherpfad.c_str();
      ShowMessage(openmotherpfad);
    
      for (int p=0; p<pro; p++)
      {
        AnsiString ProfileLoeschen;
        if (p<1000)
        {
          ProfileLoeschen=lesepfad+"Profile."+IntToStr(p);
        };
        if (p<100)
        {
          ProfileLoeschen=lesepfad+"Profile.0"+IntToStr(p);
        };
        if (p<10)
        {
          ProfileLoeschen=lesepfad+"Profile.00"+IntToStr(p);
        };
        if (FileExists(ProfileLoeschen.c_str()))
          DeleteFile(ProfileLoeschen.c_str());
      };
    
      int status = 0;
      exit(status - '0');
    }
    

    Dies ist der Beenden-Button meines Programms. Funktioniert auch, aber ich möchte vorm Beenden noch Daten in eine Ini-Datei schreiben (z.B. einen Pfad).
    Leider schreibt mir das Programm so nur das erste Zeichen in die Datei, obwohl die ShowMessage() mir alles anzeigt.
    Setze ich genau diese drei Zeilen in irgendeine andere Funktion (anderer Button) funktioniert alles problemlos.

    Was habe ich übersehen?

    Nico



  • oh Gott, das ist so lange her, dass ich mit diesen Streams gerbeitet hab... So ohne es wirklich zu wissen, müsste da zur Ausgabe nicht ein printf() her?

    Ansonsten kann ich Dir zum Thema ini-File nur mal einen Bick auf die Klasse TIniFile empfehlen.



  • Also das printf fehlt nicht, dass gibts bei den Streams so nicht wenn ich richtig informiert bin. Außerdem funktioniert das ganze ja, nur nicht unter diesem Button.
    Aber das mit der TIni-Klasse ist wahrscheinlich eine gute Idee 😉

    Nico



  • Kann es vielleicht sein, das bei Aufruf von exit der Destruktor von ofstream nicht aufgerufen wird und somit der Puffer nicht geleert wird? In der Hilfe steht zwar dass Dateipuffer geleert werden aber man weiss ja nie. Ruf doch vor dem exit iniOut.close() mal auf.



  • Am besten ist es, wenn du ofstream folgendermaßen verwendest:

    ...
      ofstream makedr("dirsave.txt", ios::out);  //öffnet Datei zum (über)schreiben
      makedr << cmbPath->Text.c_str();           //Notiert aktuelles Laufwerk
      makedr.close();                            //schließt die Datei
    ...
    

    Ist nur ein Beispiel aus meinem Programm.
    Hinweis: verwende keine CHAR - Variablen, sondern möglichst Strings oder (wie in meinem Fall) zum Beispiel ComboFelder oder Edit - Felder (ist nur so ein Vorschlag)



  • Hallo!

    Ich würde den Code hier am besten ein bischen umschreiben, so ersparst du dir die andauernd auftretenden Copy-Ctor-Aufrufe!

    if (p<10) 
        { 
          ProfileLoeschen=lesepfad+"Profile.00"+IntToStr(p); 
        }
        if (p<100) 
        { 
          ProfileLoeschen=lesepfad+"Profile.0"+IntToStr(p); 
        } 
        if (p<1000) 
        { 
          ProfileLoeschen=lesepfad+"Profile."+IntToStr(p); 
        }
    

    An deinem Code ist sonst soweit alles richtig. Vielleicht solltest du noch prüfen, ob die Datei auch erfolgreich geöffnet wurde.

    if(!iniOut)
    {
        //hier drin Fehlerbehandlung
    }
    

    Ein close() ist an nicht nötig, da der Destruktor beim verlassen der Funktion das schon erledigt.



  • Edit: Sry Doppelpost! 🙄



  • @ all:

    Danke für Eure Hilfe. Ich hab da wohl mal wieder aus Unkenntnis mit Kanonen auf Spatzen geschossen 😉
    Hab das ganze jetzt mit TIniFile gelöst. 1A!!!

    Trotzdem vielen Dank, denn merkwürdig fand ich das Problem schon...

    Nico



  • @ all:

    Danke für Eure Hilfe. Ich hab da wohl mal wieder aus Unkenntnis mit Kanonen auf Spatzen geschossen 😉
    Hab das ganze jetzt mit TIniFile gelöst. 1A!!!

    Trotzdem vielen Dank, denn merkwürdig fand ich das Problem schon...

    Nico



  • Ooops! Triple-Posting 🤡


Anmelden zum Antworten