(MFC mit dem...) dynamisch erzeugtes Array beschreiben



  • Hallo,

    ich habe da ein Problem mit der dyn. Speicherverwaltung.

    Ich lese aus einer Datei einen String in ein dyn. erzeugtes Array ein. Danach möchte ien paar ungewollte Zeichen wie z.B. ýýýýý löschen ich durchlaufe dabei eine for-Schleife die diese Zeichen selektiert und über den Zeiger ein Leerzeichen einfügt. Das funktioniert auch alles ganz gut. Sobald ich das Array wieder mit delete[] löschen will, stürtzt mir das Programm ab. Liegt das vieleicht daran das man ein dy. erzeugtes Array nicht beschrieben kann oder woran könnte das liegen. Des weiteren hab ich da noch ein Problem wenn ich strcpy benutze um den Inhalt vom dyn. Array in einem festen Array kopiere (zu Testzwecken) löscht er mir den Inhalt vom dyn. Array, Warum ?
    Anbei sende ich den Code mit. Dieser ist nur zum Testzweck da hat also keinen richtigen Sinn.

    #include <stdio.h>
    #include <afx.h>

    void main()
    {
    char* pfad = "C:\\Projekte\\Test Projekte\\test.txt";
    char str[6] = "Hallo";
    ofstream out(pfad, ios::app);
    out << str;
    out.close();

    CFile datei(pfad, CFile::modeRead);
    int size_buff = datei.GetLength();
    char* pStr = new char[size_buff];
    datei.Read(pStr, size_buff);
    datei.Close();
    datei.Remove(pfad);

    char* arr = pStr; // Wenn ich hier strcpy(arr, pStr) benutze und arr eine konstannte grösse erhält, dann ist pStr nach dem kopieren leer warum ?

    for(int i=0; i < strlen(pStr); i++)
    if((pStr[i] == -3) || (pStr[i] == -35)) // -3 und -35 sind die Zeichen die ich löschen will
    pStr[i] = ' ';

    delete[] pStr;
    }

    Ich hoffe mir kann jemand weiterhelfen.

    Im Voraus vielen Dank.

    MfG



  • Hallo!

    Was ist CFile? Ist es die MFC-Klasse? Wenn ja, dann liegt der erste Fehler schon hier:

    CFile datei(pfad, CFile::modeRead); 
    int size_buff = datei.GetLength();
    char* pStr = new char[size_buff + 1]; // Ein Zeichen länger!!!
    datei.Read(pStr, size_buff);
    datei.Close(); 
    datei.Remove(pfad);
    pStr[size_buf] = 0;                   // Nullzeichen, um String zu beenden!!!
    

    Und der wirklich fatale Fehler:

    char* arr = pStr; // Wenn ich hier strcpy(arr, pStr) benutze und arr eine konstannte grösse erhält, dann ist pStr nach dem kopieren leer warum ?

    Natürlich funktioniert es nicht, denn arr und pStr zeigen auf exakt dieselbe Addresse!!! Lösung:

    char* arr = new char[strlen(pStr) + 1];
    strcpy(arr, pStr);
    

    Jetzt hast Du wirklich zwei Zeichenketten, die Du unabhängig voneinander bearbeiten kannst.

    Gruß,
    Andreas



  • Danke

    eine Frage noch zu Read von CFile. Schliesst es nicht die Zeichenkette mit einem Nullterminierunszeichen ab ?

    MfG



  • eine Frage noch zu Read von CFile. Schliesst es nicht die Zeichenkette mit einem Nullterminierunszeichen ab ?

    Das fragst du besser im MFC-Forum.
    -> Verschoben.

    PS: Nur so als Tipp:
    http://msdn.microsoft.com/library/en-us/vcmfc98/html/_mfc_cfile.asp

    Die MSDN ist voll von solchen Beschreibungen 🙂


Anmelden zum Antworten