Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

1

31.03.2008, 21:00

Problem beim lesen aus Dateien

Hi,
Ich habe folgendes Problem: Wenn ich in einem Programm mit irgendeiner Funktion(ich hab schon alle ausprobiert)Versuche den inhalt einer Datei zu lesen, dann stürtzt mein Programm ab und ich bekomme folgende Meldung:

Zitat

Eine Ausnahme (erste Chance) bei 0x68f310db (msvcr80d.dll) in TW_Empty.exe: 0xC0000005: Zugriffsverletzung beim Schreiben an Position 0x10015542.
Windows hat einen Haltepunkt in TW_Empty.exe ausgelöst.

Dies kann auf eine Beschädigung des Heaps zurückzuführen sein und weist auf ein Problem in TW_Empty.exe oder in einer der geladenen DLLs hin.


Ich hoffe das mir jemand helfen kann.
cu
Signaturen werden überbewertet

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

2

31.03.2008, 21:32

sieht aus wie ein speicherfehler, überprüfe dringend nochmal alles speicherrelevante

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

3

31.03.2008, 23:10

Also die Datei wurde korrekt geladen und endladen. Die FILE-Variable enthält (soweit ich das beurteilen kann) korrekte Informationen. Das Problem ist nur die Lesefunktion. Egal welche Ich benutze von fread über fscanf bis hin zu fgets. Immer stürtzt das Programm ab. :(
Signaturen werden überbewertet

Firefly

Alter Hase

Beiträge: 484

Wohnort: Irgendwoundnirgendwo

  • Private Nachricht senden

4

01.04.2008, 13:24

zeig doch mal bitte entsprechenden code da meine kristallkugel leider kaputt gegangen ist... ;)

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

5

01.04.2008, 17:47

Code der Variante die ich ursprünglich benutzt hab:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// Öffnen der Datei

    // Der Name Muss TW_InitData.xml sein

    FILE* pFile;
    pFile = fopen("TW_InitData.xml", "r");
    if(pFile == NULL)
    {
        MessageBox(NULL, TEXT("File TW_InitData.xml not found!"), TEXT("Error"), MB_ICONERROR);
        return TW_NOFILE;
    }

    // Einlesen der Initialisierungsdaten

    char* pchBuffer = "";
    fgets(pchBuffer, 2, pFile);

 //...


    // die Datei schließen

    fclose(pFile);
Signaturen werden überbewertet

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

01.04.2008, 17:53

Du versuchst in geschützten Speicher zu schreiben...

C-/C++-Quelltext

1
char* pchBuffer = "";


Das ist eigentlich ein const char* auf ein Stringliteral. Da kannst du nicht schreiben drauf zugreifen, außerdem versuchst du "über" den reservierten Speicher raus zu schreiben, was aber, in diesem Fall, auch keinen Unterschied macht. ;)

Versuchs mit:

C-/C++-Quelltext

1
char pchBuffer[ 2 ] = { 0 };
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

01.04.2008, 17:54

da liegt das problem:

Zitat von »"GR-PA"«


C-/C++-Quelltext

1
2
    char* pchBuffer = "";
    fgets(pchBuffer, 2, pFile);


du musst fgets einen puffer übergeben in den es reinschreiben soll und nicht nur einen zeiger...

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

8

01.04.2008, 19:02

Zitat von »"GR-PA"«

C-/C++-Quelltext

1
2
3
    // Einlesen der Initialisierungsdaten

    char* pchBuffer = "";
    fgets(pchBuffer, 2, pFile);


du kannst es schon mit einem pointer machen, darfst ihn jedoch nicht mit "" initialisieren. wenn du anstelle dessen folgendes machst, geht es (sollte zumindest):

C-/C++-Quelltext

1
2
3
4
5
char* pchBuffer = (char*)malloc(sizeof(char)*2); // speicher fuer 2 zeichen reservieren

if( pchBuffer == NULL ) { // optional: pruefen, ob malloc ok war

    return false; // abbruch

}
fgets(pchBuffer, 2, pFile);

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

01.04.2008, 19:04

noch einfacher ging's so:

C-/C++-Quelltext

1
2
char pchBuffer[2];
fgets(pchBuffer, 2, pFile);


;)

wenn du C++ programmierst, solltest du malloc generell vermeiden und stattdessen new verwenden. außer du hast einen triftigen grund es zu verwenden. und wenn, dann solltest du den speicher auch wieder freigeben :p

GR-PA

Treue Seele

  • »GR-PA« ist der Autor dieses Themas

Beiträge: 326

Wohnort: Daheim

Beruf: Faulenzer

  • Private Nachricht senden

10

01.04.2008, 20:05

Wieder so ein dummer Fehler meinerseits *Kopf auf den Tisch hau* :evil: :evil:
Signaturen werden überbewertet

Werbeanzeige