Datei schreiben/lesen klappt nicht
-
Hallo! (Wieder Ich)
Ein für mich schwieriges Thema ist immer die Dateiarbeit in C++ da ich diese Char Zeiger hasse... Bei Ausführung des folgenden Quelltextes wird bei einem ersten Durchgang alles richtig gemacht nur bei nochmaliger Ausführung gibts an gekennzeichneter stelle immer ne Belegung mit absoluten ascii müll...
DeleteFileA("c:\\test.dat"); int MyFileHandle = FileCreate("c:\\test.dat"); if (MyFileHandle < 0) MyFileHandle = FileOpen( "c:\\test.dat",fmOpenReadWrite ); //Schreiben AnsiString Entry = Edit1->Text; int LengthOfEntry = Entry.Length() + 1; FileWrite(MyFileHandle, &LengthOfEntry, sizeof(LengthOfEntry)); FileWrite(MyFileHandle, Entry.c_str(), LengthOfEntry); Entry = Edit2->Text; LengthOfEntry = Entry.Length()+ 1; FileWrite(MyFileHandle, &LengthOfEntry, sizeof(LengthOfEntry)); FileWrite(MyFileHandle, Entry.c_str(), LengthOfEntry); //ist .c_str() okay? is doch nicht zum belegen gedacht oder FileClose(MyFileHandle); //Lesen MyFileHandle = FileOpen( "c:\\test.dat", fmOpenReadWrite ); LengthOfEntry = 0; char * buffer; // versuch mit char* da auch AnsiString nicht funzt FileRead(MyFileHandle, &LengthOfEntry , sizeof(LengthOfEntry)); buffer = new char[LengthOfEntry]; FileRead(MyFileHandle, buffer, LengthOfEntry); //!!!!!!!!!!! GEKENNZEICHNETE STELLE ;) Memo1->Lines->Add(buffer); //gibt beim 2. mal ascii-wust aus delete buffer; buffer =0; LengthOfEntry = 0; FileRead(MyFileHandle, &LengthOfEntry , sizeof(LengthOfEntry)); FileRead(MyFileHandle, Entry.c_str(), LengthOfEntry ); Memo1->Lines->Add(Entry);Hab ich das mit dem schreiben denn richtig gemacht? (Länge ermitteln etc.)
-
Ach ich bin soo blöde... hab die datei doch nach den lesen nicht geschlossen ;))
Sorry fürs zumüllen!
-
ne paar fragen hätt ich aber noch:
Das mit dem Belegen per AnsiStringNAME.c_str() is doch nicht in Ordnung oder?
Wie kann ich das auf einfache weise umgehen und einen AnsiString erhalten?
Beim Schreiben und Lesen muss ich doch die Nulltermination miteinberechnen oder?Problem ist dass das zu schreibende Zeugs nicht echter AsciiCode sondern Sonderzeichen sind etc.
Hört er falls er innerhalb des zuschreibenden char "arrays" ein \0 findet eher auf mit schreiben?Wie kann ich Sonderzeichen wie \0 und \irgenwas an einen AnsiString oder char * anhängen? mit += gehts nicht....
-
hi,
zu den ersten drei fragen enthalt ich mich lieber, da ich mir nicht sicher bin!4.: wenn du einen backslash setzt, dann weiss der compiler, dass das nachfolgende zeichen zum string gehört. Also auch \0, \irgendwas^^ daher ist auch nur \\ ein \
5.: mit strcat(); kannst du an den wert von variablen einen String oder eine Variable anfügen.
Bsp.:#include <stdio.h> String buffer="hallo welt!"; //vars String anders=" wie geht\'s?"; strcat(buffer,anders); // buffer="hallo welt! wie geht\'s?" ShowMessage("Buffer hat den Wert "+buffer);eine nützliche funktion!
[edit] verwandte funktionen von strcat():strcpy(); um den wert von variablen zu ersetzen
strcpy(buffer,"hallo"); buffer wird "hallo"strcmp(); um den wert von vars auf gleichen wert zu prüfen
strcmp(buffer,buffer); gibt 0 zurück, da buffer gleich buffer
ist, also gleicher wert gleich 0strlen(); müssten wohl alle wissen^^
ich glaub das waren alle strs
-
Blackhawk schrieb:
5.: mit strcat(); kannst du an den wert von variablen einen String oder eine Variable anfügen.
Wenn du mit AnsiString arbeitest, kannst du weitere Strings mit dem Operator + oder dem Operator += anhängen, das ist wesentlich komfortabler als strcat().
AnsiString as("Hallo,"), as2(" Welt!"); as = as + as2; //oder as += as2;
-
@PuppetMaster2k
damit gehts nicht denn ich hab ja Zeichen wie zb. \0 oder ähnliches
-
genau
deswegen nimm strcat
-
Also Leute hier noch mal die Funktion, wie gesagt es funzt nich wenn ich \0 oder ähnliche zeichen an den Char Zeiger anhängen will, da die funktion strcat ja bis zum \0 kopiert...
AnsiString DeCryptString(AnsiString ToCrypt, int Length, AnsiString Key, bool Crypt = true){ char* Crypted; char AddChar[1]; for(int i=1,j=1; i <= Length; i++, j++){ if(j == Key.Length() ) j = 1; if (!Crypt && (ToCrypt[i] == char("_") ) ) ToCrypt[i] = char("\0"); AddChar[1] = Crypt ? ( ToCrypt[i] ^ Key[j] ) : ( Key[j] ^ ToCrypt[i] ); if (Crypt && (AddChar[1] == char("\0") ) ) AddChar[1] = char("_"); strcat(Crypted, AddChar ); } return Crypted; }
-
Wenn du Zeichen wie \0 mit in deine Felder aufnehmen willst, dann kannst du auch keine Stringfunktionen (wie strlen, strcat etc.) mehr verwenden. In dem Fall bieten sich Funktionen wie memcpy o.ä. an, bzw. die Verwendung von Streams.
@Blackhawk
strcat mit zwei AnsiStrings (wie du oben geschrieben hast) sollte gar nicht funktionieren und einen Compilerfehler bringen.