Mysteriöse unhandled exception bei fscanf



  • Servus,

    ich hab gerade ein extrem nerviges Problem beim Auslesen einer Textdatei.
    Wenn ich, wie im angegebenen Code

    FILE *pFile = fopen("D:\\work\\output.txt", "r");
    	if(pFile == NULL)
    		return;
    
    	fscanf(pFile, "%s", szHelper);
    	fscanf(pFile, "%s", szHelper);
    	fscanf(pFile, "%s", szHelper);
    	fscanf(pFile, "%s", szHelper);
    
    	fclose(pFile);
    

    vorgehe, erhalte ich eine

    "Unhandled exception at 0x7c800067 in DisparityForecast.exe: 0xC0000096: Privileged instruction."
    in: afxstate.cpp
    bei:

    BOOL AFXAPI AfxActivateActCtx(HANDLE hActCtx, ULONG_PTR *lpCookie) 
    {	
    	BOOL rc = pfnActivateActCtx != 0 ? pfnActivateActCtx(hActCtx, lpCookie) : FALSE;	
    	return rc;
    }
    

    Lasse ich ein fscanf weg, dann kommt folgender Fehler erst beim Schließen des Programms:
    "Unhandled exception at 0x7c813000 in DisparityForecast.exe: 0xC0000096: Privileged instruction."
    in: afxstate.cpp
    bei:

    void AFXAPI AfxReleaseActCtx(HANDLE hActCtx)
    {	
    	if (pfnReleaseActCtx != 0)
    	{
    		pfnReleaseActCtx(hActCtx);
    	}
    }
    

    Begrenze ich das ganze auf 2 fscanf erhalte ich keinen Fehler....
    Was ist da los? Ich hänge da gerade schon seit 3h dran.

    Inhalt der Datei geht wie folgt los:
    ID VehicleTime VehicleSpeed VehicleSteerAngle VehicleMapPosX ...

    Bitte um einen Ratschlag. Ich verwende VS 2005 unter WinXP.


  • Mod

    Wie groß ist szHelper? Wie ist szHelper deklariert? Was steht in der Datei was Du lesen willst.

    In dieser Form ist fscanf extrem gefährlich, weil Du Dich in keiner Weise gegen einen Buffer Overrun schützt.
    Und vermutlich bekommst Du genau das: Einen Buffer Overrun. Der Stack wird zerstört.

    Wie man unschwer sieht ist VehicleSteerAngle 17 Zeichen lang. Mit Null-Zeichen müsste Dein Buffer mindestens 18 Zeichen groß sein.



  • szHelper ist ein CString.

    CString szHelper;
    

    Ich hatte es auch schon mit fscanf_s probiert und dann einfach 100 als Länge übergeben, da nie ein String länger sein wird in der Datei.

    Ich möchte zu Beginn nur den Kopf der Datei lesen, der aus den einzelnen Strings besteht, die am Ende meines 1. Postings zu lesen waren.

    Danach kommen nur noch Zahlen.


  • Mod

    Wha! Ein CString. Das kann doch nicht gehen. Das muss ja abrauchen...

    CString ist eine Klasse. fscanf erwartet einen char*. Ein CString ist nicht mal ein Ersatz dafür.

    Folgendes kann gehen:

    fscanf(pFile, "%s", szHelper.GetBuffer(100));
    szHelper.ReleaseBuffer();
    

    oder

    fscanf(pFile, "%s", CStrBuf(szHelper,100));
    

    Wenn es geht versuche mal den Unterschied zwischen puren Zeigern, und Klassen und Containern zu verstehen. Das eine ist oft genug kein Ersatz für das andere.

    BTW: In der ungarischen Notation werden nur char Arrays mit sz begonnen. CString Variablen bekommen den Prefix str!



  • Man nannte Ihn Gott! 😃

    Vielen Dank für die Hilfe. Haut genau hin.
    Ich werde mich in den Containern verstecken 🙂


  • Mod

    Jöran schrieb:

    Man nannte Ihn Gott! 😃

    Großer erhabener und weiser Guru hätte voll auf genügt... 🤡


Log in to reply