3000 Zeichen in einem CString



  • Ich möchte 3000 Zeichen in einen CString speichern.
    Mein Problem ist, dass nur 1010 gespeichert werden!

    Die Funktion "GetAllocLength();" gibt jedoch zurück, dass 3070 Zeichen reserviert wurden!

    Kann mir jemand sagen, wo dass der Fehler liegt?



  • Ohne etwas Code - nein.



  • Ok sorry, habe ich ganz vergessen 😞

    CString szTemp;
    szTemp="";
    
    for(int x=0;x<3000;x++)
    {
      szTemp=szTemp+"a";
    }
    

    Am Ende der Schlaufe befinden sich nur 1010 "a"'s in szTemp!
    Wieso??



  • Erstmal ist es vermutlich speicherschonender, wenn du die kombinierte Zuweisung szTemp+="a"; verwendest.

    Zweitens: Hast du das selber nachgezählt oder die Methoden der CString-Klasse (GetLength()) verwendet?



  • Ich habe auch manchmal Probleme, wenn ein String mit sehr, sehr vielen += immer weiter verlängert werden soll. Irgendwann bricht er ab. Mit einem strcpy(...) und dann sehr, sehr vielen strcat(...) funktioniert es dann normalerweise.



  • teil doch auf in lauter 1000. schleifen und die dann zusammensetzen #gggg


  • Mod

    addict schrieb:

    CString szTemp;
    szTemp="";
    
    for(int x=0;x<3000;x++)
    {
      szTemp=szTemp+"a";
    }
    

    Ist zwar übler Code aber geht bei mir ohne Probleme!



  • viele Dank für die Antworten!
    An was könnte es denn liegen, weshalb es bei mir nicht funktioniert?
    Nei ich habe es nicht selbst nachgezählt... 😉 Habe den Inhalt des Strings ins Word kopiert und dort die Zeichen zählen lassen 😉

    Wieso ist mein Code übel? 😉



  • addict schrieb:

    Habe den Inhalt des Strings ins Word kopiert und dort die Zeichen zählen lassen 😉

    Dann könnte es auch sein, daß auf dem Weg nach Word die Hälfte des Strings verlorengegangen ist (btw, WIE hast du den kopiert?) - wenn du sicher die Größe wissen willst, frag den String doch einfach (GetLength() liefert die wirkliche Länge des Strings).

    Wieso ist mein Code übel? 😉

    Die Anweisung szTemp = szTemp + "a"; kopiert den Inhalt von szTemp in eine temporäre Variable, hängt an diese ein 'a' an und kopiert sie anschließend wieder zurück - wenn du das 3000 mal machst, wird da einiges hin- und herkopiert.



  • habe den Text einfach aus dem Debug-Fenster kopiert...
    Wenn ich mit GetLength die länge hole gibt dies 1880 aus (dies könnte stimmen)
    wenn ich jedoch den String in eine Datei schriebe befinden sich darin nur gerade 1010 Zeichen!
    Wie kann ich dem CString einen fixen Speicherbereich vergeben?



  • Imk Debug fenster wird nicht der ganze String angezeigt



  • Nur als kleiner Hinweis: Die Speicherverwaltung in C/C++ ist "miserabel" (zumindest im Vergleich zum GC 😉 ).
    Und das was Du in Deinem Beispiel machst ist fast tödlich... es erzeug nämlich massiv fragmetierten Speicher, der bei *jeder* allokation komplett durchgelaufen werden muss...
    Bzgl. Speicher mag ich C# nicht mer missen... (vermutlich ist der gleiche Code in C# auch 100x schneller als in C++/MFC 😉 ).



  • Hallo,
    man kann eine Datei komplett in einer string speichern.
    es ist richtig dass debugfenster zeigt nicht das komlettstring.
    lieber machst du mit dem Maus auf dem Variable vorbeifahren dann gibt er dir den Inhalt der string , davon kannst du koppieren


Log in to reply