Access Violation Fehler, Invalid Pointer operation [gelöst]



  • Zuerst zu deinen Kommentaren zu meinen Bemerkungen
    1.
    für cout mit AnsiString
    dann mußt du das ein wenig anders machen

    AnsiString test("test");
    cout << test.c_str();
    

    siehe auch FAQ bzw. die Hilfe zu den Memberfunktionen von AnsiString.
    Bei std::string ist das ähnlich. Auch die besitzen überladene Operatoren für + und += sowie die Funktion c_str().

    2. sprintf gibt es auch bei Ansistring (als Memberfunktion). Du kannst es aber auch einfach mit + bzw. += machen.
    Bsp.

    // deine Version
    sprintf(datei, "%s%s", verzeichnis, "\\DATEI.txt");
    
    // wenn datei AnsiString ist
    datei = verzeichnis;
    datei += "\\Datei.txt";
    

    Zum Fehler
    Könnte am delete[] von datei liegen. Verschiebe das mal eine Klammer nach unten. Du machst das delete ja in der for-Schleife (ohne neues new).



  • Braunstein schrieb:

    Zuerst zu deinen Kommentaren zu meinen Bemerkungen
    1.
    für cout mit AnsiString
    dann mußt du das ein wenig anders machen

    AnsiString test("test");
    cout << test.c_str();
    

    siehe auch FAQ bzw. die Hilfe zu den Memberfunktionen von AnsiString.
    Bei std::string ist das ähnlich. Auch die besitzen überladene Operatoren für + und += sowie die Funktion c_str().

    Man kann auch direkt AnsiString verwenden, wenn man das aus der BCB-Hilfe beachtet :

    Wenn Sie #include <iostream> oder #define VCL_IOSTREAM angeben, bevor Sie die include-Anweisung für die Datei dstring.h (die normalerweise indirekt durch die Datei vcl.h einbezogen wird) festlegen, können Sie die Streaming-Operatoren (<< und >>) mit AnsiStrings als Argument verwenden:

    ostream& operator << (ostream& os, const AnsiString& arg);
      istream& operator >> (istream& is, AnsiString& arg);
    

    bis bald
    akari



  • [cpp]// Variablendeklaration
    char****** Dateiname_neu = new char[64];[/cpp]

    Der Rückgabetyp des Ausdrucks

    new char[64];
    

    ist nämlich ein Pointer auf ein Feld von char.

    Vielleicht liegt's daran.

    Oli

    [Edit]
    P.S. Leider habe ich Unrecht. Der Rückgabetyp ist ein char*. 🙄
    [/Edit]



  • Hallo Oli,

    Lies dir bitte deinen eigenen Post nochmal durch. Deine Aussage ist falsch.



  • der oli schrieb:

    [cpp]// Variablendeklaration
    char****** Dateiname_neu = new char[64];[/cpp]
    .
    .
    Oli

    Hallo Oli, hier nicht, Das hier ist kein Zeiger auf Zeiger!!!



  • Das sagte ich bereits (zumindest so ähnlich 😉 ).



  • bin dabei, mich selbst aufzuklären.

    oli



  • hab jetzt folgendes verändert:

    Alt:

    char* datei = new char[64];               
       sprintf(datei, "%s%s", verzeichnis, "\\Datei.txt");
    

    Neu:

    AnsiString datei;
       datei = verzeichnis;
       datei += "\\Datei.txt";
    

    Problem:

    if ((f = fopen(datei, "r"))==NULL)
    

    fopen braucht anscheinend nen char-array.

    Wie würdet ihr das machen??? Das char-array lassen und wieder Angst vor Speicherfehlern 😞 oder kann man das wieder umwandeln und was war das mit diesen Streams? Leider is die Suchfunktion ja im Moment eher unbrauchbar..



  • Hallo,

    1. siehe FAQ
    2. Was für Probleme hast du mit den Streams?



  • Das FAQ-Beispiel hat geholfen, allerdings hab ich seitdem die Speicherfehler weg sind das Problem, dass das Umbenennen der Datei nicht mehr funktioniert. Habt ihr dazu eine Idee???



  • Was genau funktioniert denn nicht.
    Da wir deinen neuen Code nicht kennen und meine Kristallkugel auch in der Reperatur ist, weiß ich erstmal nicht weiter. 😉



  • Hab den Code weiter oben schonmal gepostet... aber hier nochmal einen Ausschnitt:

    Die Datei ist auf jeden Fall vorhanden, das wid mit:

    if ((f = fopen(datei, "r"))==NULL)  // Wenn DATEI NICHT VORHANDEN
            {
                // Fehler
                cout << "Fehler: In Verzeichnis " << i_verzeichnisse+1 << " wurde die gesuchte Datei nicht gefunden!\n\n";
            }
            else    // Wenn DATEI VORHANDEN
            {
    // Code...
    

    geprüft.

    Umbenannt wird hier (Forsetzung von else):

    if (RenameFile(DateiPfad_Name,Dateiname_neuStr))
                    {
                        cout << " Datei wurde umbenannt und verschoben nach " << Dateiname_neuStr.c_str() << "!\n\n";
                    }
                    else
                    {
                        textcolor(LIGHTRED); //Farbe
                        cprintf("%s%d%s", "Fehler: Datei in Verzeichnis ", i_verzeichnisse+1, " konnte nicht umbenannt werden!\n");
                    }
    

    Variablen:

    AnsiString DateiPfad_Name;  // Alter Dateipfad + Name
                    AnsiString Dateiname_neuStr; // Neuer Dateipfad + Name
    

    Es wird auch keine Fehlermeldung vom Compiler ausgegeben, das Programm läuft und zeigt dann den else-case (Konnte nicht umbenannt werden) an. Aber warum???



  • Schau doch mal nach ob eine Datei mit dem neuen Namen bereits existiert. Vielleicht ist deine Datei aber auch noch offen.
    Desweiteren schau mal in die Hilfe zu FileExists.



  • Hey, das ist die Lösung, wie soll er sie auch umbenennen, wenn sie noch offen ist... 💡

    Big fat thx 😉


Anmelden zum Antworten