Problem beim Auslesen und Schreibe von Dateien (SaveToFile)



  • Hi, das Problem ist, das ich beim speichern und dann wieder
    in Memo einlesen, immer mehr leere zeilen am ende bekomme, woran kann das liegen?

    char settingfile[MAX_PATH];
    char tempfile[MAX_PATH];
    GetModuleFileName(NULL, (LPSTR)settingfile, MAX_PATH);
    GetModuleFileName(NULL, (LPSTR)tempfile, MAX_PATH);
    
    strcpy(strrchr((char *)settingfile, '\\')+1, "settings.ini");
    strcpy(strrchr((char *)tempfile, '\\')+1, "temp.tmp");
    
    int code = GetPrivateProfileInt("KeyCode","Code",1,settingfile);
    
    // Crypt :
    AnsiString text;
    AnsiString crypt;
    TStringList* temp = new TStringList();
    for(int x = 0 ; x <= datei_normal->Lines->Count ; x++)
    {
            text = datei_normal->Lines->Strings[x];
            crypt = crypt.SetLength(text.Length());
            for(int y = 1 ; y <= datei_normal->Lines->Strings[x].Length() ; y++)
            {
               crypt[y]=text[y] ^code;
            }
            temp->Add(crypt);
            //datei_normal->Lines->Strings[x] = crypt;
    
    }
    temp->SaveToFile(tempfile);
    datei_normal->Clear();
    datei_normal->Lines->LoadFromFile(tempfile);
    


  • das kann verschiedene Ursachen haben. z.B. könnte es geschehen, dass bei der 'Verschlüsselung' Steuerzeichen 'berechnet' werden. Die verschlüsselte Datei einzulesen, ohne diese beim Einlesen vorher wieder zu entschlüsseln ist nicht aussagekräftig.

    Vielleicht noch die Anmerkung, dass man Daten erst komprimieren sollte, bevor man sie veschlüsselt. Das erhöht die Entropie und erschwert ein Entschlüsseln. Des weiteren würde ich die Verschlüsselelung Daten nicht über AnsiString durchführen, sondern direkt im Arbeitspeicher über einen TMemoryStream.

    Joe_M.



  • Und wie realisiere ich beides?

    Also Komprimierung, Verschlüsselung wird in einem TStringList gespeichert,
    ist ja im PrinzipArbeitsspeicher oder?



  • Nein, ich würde in diesem Fall kein AnsiString (TStringList) verwenden (Steuerzeichenproblematik), sondern die Daten in einen TMemoryStream schreiben, in einen zweiten TMemoryStream komprimieren und diesen dann in per TFileStream in eine Datei schreiben. Zum Einlesen dann den umgekehrten Weg wählen. Für die Komprimierung solltest Du mal bei Google suchen. Es gibt schon fertige Bibliotheken dafür (sogar Winzip-kompatibel). Vielleicht gibt's hier in den FAQs auch was dazu.

    Joe_M.



  • Mhmm, kann ich MemoryStream benutzen wie SringList?
    und warum den umweg über eine Datei?
    Brauche ich nicht unbedingt, half mir nur bei meiner Lösung.



  • hm, bevor wir aneinander vorbeireden...
    Was genau versuchst Du zu erreichen?


Anmelden zum Antworten