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 soAnsiString 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 soFStream->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