AnsiString in File Schreiben



  • #include <vcl.h>
    #pragma hdrstop
    
    #include "Schicht.h"
    #include <direct.h>
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    // Buffer
    wchar_t * buffer_1[256];
    AnsiString buffer_2[10];
    // Arbeitsverzeichnis Wide Char 16 bit Unicode
    wchar_t* Path = _wgetdcwd(0,*buffer_1, 256);
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    
            // Create Settings Ini
            if(!FileExists((AnsiString)Path+"\\Settings.ini"))
            {
    
            TFileStream *FStreamCreate = new TFileStream((AnsiString)Path+"\\Settings.ini",fmCreate);
            FStreamCreate->~TFileStream();
    
            }
            // Read Settings Ini
            TFileStream *FStream = new TFileStream((AnsiString)Path+"\\Settings.ini",fmOpenReadWrite);
            FStream->Seek(0,soFromBeginning);
            FStream->Read((PVOID)buffer_2,10);
            //Debug--------------------------------
            Panel1->Caption=*buffer_2;
            //-------------------------------------
    
            // Write Settings Ini
            while(!FileExists(*buffer_2))
            {
             op_ExeFile->Execute();
             *buffer_2=op_ExeFile->FileName;
             FStream->Write((PVOID)buffer_2,1);
    
            }
            //Debug--------------------------------
            Panel1->Caption=*buffer_2;
            //-------------------------------------
    
    }
    

    in buffer_2 steht kurz vorm schreiben

    "D:\\Programme\\Kalenderchen\\Kalenderchen.exe"

    im ersten abschnitt, und ich will das er jetzt diesen ersten abschnitt da reinschreibt. wie mache ich das? bis jetzt schreibt er nur ein zeichen rein und das sind manchmal so komische sonderzeichen ^^



  • Warum nimmst du nicht "TIniFile"?
    Wenn du ini Dateien haben willst.

    such mal danach



  • Hallo

    Was glaubst du bedeutet die 1 in dieser Zeile?

    FStream->Write((PVOID)buffer_2,1);
    

    Und auch ansonsten gibt es noch mehrere Probleme, zum Beispiel das Behandeln eines Arrays als einzelnen String oder das binäre Speichern eines AnsiString-Objekts.

    Also fangen wir oben an
    - Das Arbeitsverzeichnis deiner Anwendung bekommst du so

    AnsiString Path = ExtractFilePath(Application->ExeName);
    

    - Vermutlich brauchst du gar kein AnsiString-Array. Wenn doch übergibst du ein Element davon an ein TEdit so

    Panel1->Caption=buffer_2[0];
    

    - Du sollst nicht wchar_t* und char mischen, genausowenig wie entsprechende String-Klassen. Wenn du es doch brauchst must du entsprechend konvertienren.
    - Das binäre Schreiben eines AnsiStrings in ein Stream geht so

    FStream->Write(Path.c_str(),Path.Length());
    

    - Du willst offenbar Ini-Dateien bearbeiten. Verwende besser gleich TIniFile.

    bis bald
    akari



  • akari schrieb:

    Hallo

    Was glaubst du bedeutet die 1 in dieser Zeile?

    FStream->Write((PVOID)buffer_2,1);
    

    ^^ das konnte ich mir schon denken nur mein problem dabei war das ermitteln der länge des AnsiStrings

    aber danke schonmal, hast mich schon viel weiter gebracht.

    zur ini, ja das TIni wäre vieleicht ne option aber die ini ist ja sozusagen nur ne kleine übung für die datei die ich dann eigentlich editieren will.

    #include <vcl.h>
    #pragma hdrstop
    
    #include "Schicht.h"
    
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    AnsiString buffer_2[100];
    AnsiString Path = ExtractFilePath(Application->ExeName) + "Settings.ini";
    
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
            // Build Settings Ini
            if (!FileExists(Path){
            TFileStream *FCreateStream = new TFileStream(Path,fmCreate);
            FCreateStream->~TFileStream();
            }
            // Read Settings Ini
            TFileStream *FStream = new TFileStream(Path,fmOpenReadWrite);
            FStream->Read(&buffer_2,FStream->Size);
            // Write Settings Ini
            while(!FileExists(buffer_2[0]))
            {
             OpnDia_ExeFile->Execute();
             buffer_2[0]=OpnDia_ExeFile->FileName;
             FStream->Write(buffer_2[0].c_str(),buffer_2[0].Length());
            }
            //Debug--------------------------------
            Panel1->Caption=buffer_2[0];
            //-------------------------------------
    
    }
    

    Mein neues problem. die ini hat 47 zeichen und ich wills einlesen.

    ich starte und krieg gleich mal nen error ( wenn die ini nicht da ist und er sie erst schreibt ist das nicht so )

    außerdem sehe ich wenn ich debugge das er den 2ten buffer ( buffer_2 ) nicht ordentlich füllt. er schreibt in die ersten 11 fächer "" und sonst lässt ers auf NULL



  • Ich hab auch mal was mit INI-Dateien gemacht und hab da die Funktionen WritePrivateProfileString und GetPrivateProfileString benutzt.
    Vllt hilft dir das weiter.



  • also das es die funktionen gibt wusste ich nicht aber danke, dennoch. die ini ist ja sazusagen nur der anfang und ich will dann noch ne andere datei auf die weise editieren ^^ deswegen würd ich gerne wissen warum das das nicht richtig ausließt



  • Hallo,

    Sehe ich das richtig, daß Du irgendwelche Strings aus 'ner Datei lesen willst ?
    Dann mach's doch einfach so :

    // Das könnte auch in den Constructor...
    TStringList *Liste = new TStringList();
    
    AnsiString Path = ExtractFilePath(Application->ExeName) + "Settings.ini";
    if (FileExists(Path))
      Liste->LoadFromFile(Path);
    for (int i = 0; i < Liste->Count; i++)
    {
      // ToDo
    
    }  // for (int i = 0; i < Liste->Count; i++)
    
    // Das könnte auch in den Destructor...
    if (Liste != NULL)
    {
      Liste->Clear();
      delete Liste;
      Liste = NULL;
    }  // if (Liste != NULL)
    

    Wenn ich noch was anmerken darf :
    Das ist dann allerdings keine INI-Datei. Eine INI-Datei sieht so aus : Initialisierungsdatei
    Wenn Du nur ein paar Strings in die Datei schreiben willst, benenne die Datei lieber um, z.B. "Settings.cfg" o.ä.

    Nash


Anmelden zum Antworten