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 0

    strlen(); 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.


Anmelden zum Antworten