Beschränkung Dateigröße ???



  • Heidio

    Ich habe zur Zeit "kleines" Problem. Während der Laufzeit meines Programmes schreibe ich Daten in eine Datei - bei einer Größe von 24.576 Byte bricht er jedes mal ab, unabhängig von der Anzahl der Zeilen in der Datei.

    Gibt es in VC++6 eine Beschränkung der Dateigröße, und wenn ja wie kann ich diese vielleicht umgehen?

    danke schonmal

    cu



  • Die maximale Dateigröße hängt vom Dateisystem ab. Auf FAT 32 geht glaub ich bis 2 GB und bei NTFS geht noch mehr!

    Aber bei so wenig sollte dir wohl klar sein das du nicht ans Limit gestossen bist.

    Zeig deinen Quelltext.



  • So, hier ist die ganze Funktion

    Es werden praktisch nur CStrings in die Datei geschrieben.

    void CGPS_04_DocAnsichtDoc::F_Berechnung_Weg()
    {
    	double s0 = 0;				//Kilometerzählung relativ - Start bei 0
    	// s_in_km_relativ = v_kmh * t + s0
    	double v_ms;				//während der Rechnung in m/s
    	double s;					//zurückgelegter Weg in m
    	int t,T;					//Laufvariable, Gesamtzeit
    	CString Weg;
    	char string[4];
    	//!! Zeilenanzahl = Anzahl der Messwerte entspricht genau der Zeit, da
    	//jede Sekunde ein Messwert reinkommt
    	T = m_AnzahlMesswerte;
    
    	CFile Datei;
    	CString datei_neu, enter="\r\n", leer="	";
    	datei_neu = "[s]_"+Dateiname;
    	Datei.Open(datei_neu, CFile::modeCreate|CFile::modeWrite);
    	CArchive ar(&Datei, CArchive::store); 	
    
    	for(t=0; t<m_AnzahlMesswerte;t++)
    	{
    		v_ms = atof(v_kmh.GetAt(t)) / 3.6;		//Umrechnung in m/s
    		s = v_ms*1 + s0;						//zurückgelegter Weg in einer Sekunde 
    		s0 = s;									//für Gesamtweg
    
    		s_in_km = s / 1000;						//Gesamtweg
    		Weg.Format("%.2lf",s_in_km);			//zwecks Übergabe Formatierung
    		s_von_t.Add(Weg);
    
                      CString zeit_s = itoa(t+1,string,10);
    		ar<<Weg;
    		ar<<';';
    		ar<<leer;
    		ar<<';';
    		ar<<leer;
    		ar<<v_kmh.GetAt(t);
    		ar<<';';
    		ar<<zeit_s;
    		ar<<enter;
    	}
    	ar.Close();
    	Datei.Close();
    
    }
    

    Vielleicht ist der Puffer, oder das Archiv dann voll? Es sind immer knapp 1000 Zeilen bevor er abbricht.



  • Vielleicht bringt ja ein
    ar.Flush();
    Datei.Flush();
    hinter ar<<enter; etwas...



  • Moin moin

    Ich habe doch diese Formatierung

    Weg.Format("%.2lf",s_in_km);
    

    wenn ich in meinem Dokument welches ich beschreibe die Zeile 1000 erreicht habe, bringt er an dieser Stelle einen Fehler, jedoch steht dieser Wert ansonsten nicht in Zusammenhang mit anderen.
    Wenn der zeit_s den Wert 1000 erreicht hat ist dann halt der Fehler.

    Ist an dieser Formatierung irgendetwas falsch gemacht?

    cu



  • Ich weiss jetzt nicht ob es daran liegt, aber bei einem Float-Wert kann man meines Wissens nach den "l"-Format-Bezeichner vergessen. Also statt

    %.2lf
    

    würde ich mal

    %.2f
    

    versuchen.



  • Ja ist schon richtig - hab ich auch probiert, ohne Erfolg 😞

    Wenn ich den Wert als double in die Datei reinschreibe, steht dann nur Schmutz drin- das bringt alles durcheinander. Wird er gleich weggelassen läuft alles bis zum Ende durch. Es müssen also Strings sein. Gibt es noch eine andere Möglichkeit zur Konvertierung?

    Mit _ecvt tritt exakt das selbe Problem auf - ich kann nicht mehr wie 999 Werte konvertieren, HELP 🙄 ???

    Woran kann das liegen, und wie kann ich dieses Problem lösen?



  • Hat das vielleicht etwas mit dem Heap zu tun, weil er bringt die Fehlermeldung in der Datei dgbheap.c ?



  • roeschti schrieb:

    Hat das vielleicht etwas mit dem Heap zu tun, weil er bringt die Fehlermeldung in der Datei dgbheap.c ?

    Zeig doch mal den genauen Wortlaut der Fehlermeldung und die Aufrufliste zu dem Zeitpunkt, wo der Fehler auftritt.



  • Also hier die Fehlermeldung:

    Debug Assertion Failed!
    Programm: .....\ ...\.. .exe
    File:dbgheap.c
    Line:1011

    Expression: _CrtIsValidHeapPointer(pUserData)

    For information....
    usw.

    Was meinst du mit Aufrufliste?
    Bei

    Weg.Format("%.2f",s_in_km)
    

    steigt er beim 1000mal aus.



  • roeschti schrieb:

    Was meinst du mit Aufrufliste?

    Aufrufliste, in der englischen Version "Callstack". Ein Debugfenster, in dem eine Liste der Funktionen steht, die gerade aufgerufen sind.

    Du hast da irgendein Speicherproblem. Ich vermute, dass es nichts mit dem Code an dieser Stelle zu tun hat, sondern sich erst dort bemekrbar macht.



  • Also hier ist die Aufrufliste:
    F_Berechnung_Weg ist die Funktion in der ich gerade arbeite, die wiederum von der Funktion OnGeschwZeit aus CChildFrm aufgerufen wird.
    Mit dem rest kann ich nicht viel anfangen.

    CGPS_04_DocAnsichtDoc::F_Berechnung_Weg() line 294
    CChildFrame::OnGeschwZeit() line 126
    _AfxDispatchCmdMsg(CCmdTarget * 0x004328c0 {CChildFrame hWnd=0x003f0674}, unsigned int 32773, int 0, void (void)* 0x0040120d CChildFrame::OnGeschwZeit(void), void * 0x00000000, unsigned int 12, AFX_CMDHANDLERINFO * 0x00000000) line 88
    CCmdTarget::OnCmdMsg(unsigned int 32773, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 302 + 39 bytes
    CFrameWnd::OnCmdMsg(unsigned int 32773, int 0, void * 0x00000000, AFX_CMDHANDLERINFO * 0x00000000) line 894 + 24 bytes
    CWnd::OnCommand(unsigned int 32773, long 0) line 2088
    CFrameWnd::OnCommand(unsigned int 32773, long 0) line 317
    CWnd::OnWndMsg(unsigned int 273, unsigned int 32773, long 0, long * 0x0012fafc) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 32773, long 0) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x004328c0 {CChildFrame hWnd=0x003f0674}, HWND__ * 0x003f0674, unsigned int 273, unsigned int 32773, long 0) line 215 + 26 bytes
    CMDIFrameWnd::OnCommand(unsigned int 32773, long 0) line 55 + 35 bytes
    CWnd::OnWndMsg(unsigned int 273, unsigned int 32773, long 0, long * 0x0012fcc4) line 1597 + 28 bytes
    CWnd::WindowProc(unsigned int 273, unsigned int 32773, long 0) line 1585 + 30 bytes
    AfxCallWndProc(CWnd * 0x004313b0 {CMainFrame hWnd=???}, HWND__ * 0x004905dc, unsigned int 273, unsigned int 32773, long 0) line 215 + 26 bytes
    AfxWndProc(HWND__ * 0x004905dc, unsigned int 273, unsigned int 32773, long 0) line 368
    AfxWndProcBase(HWND__ * 0x004905dc, unsigned int 273, unsigned int 32773, long 0) line 220 + 21 bytes
    USER32! 77d18709()
    USER32! 77d187eb()
    USER32! 77d189a5()
    USER32! 77d1bccc()
    CWinThread::PumpMessage() line 846
    CWinThread::Run() line 480 + 11 bytes
    CWinApp::Run() line 400
    AfxWinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f3f, int 1) line 49 + 11 bytes
    WinMain(HINSTANCE__ * 0x00400000, HINSTANCE__ * 0x00000000, char * 0x00141f3f, int 1) line 30
    WinMainCRTStartup() line 330 + 54 bytes
    KERNEL32! 7c816d4f()



  • roeschti schrieb:

    CGPS_04_DocAnsichtDoc::F_Berechnung_Weg() line 294

    Ist das die Aufrufliste zu dem Zeitpunkt, wo der Fehler auftritt, oder ist das ein Haltepunkt? Eigentlich müsste darüber noch etwas stehen.



  • Ich entschuldige mich für die Belästigung und danke allen Beteiligten 😃

    Der Fehler lag in der Zeile

    zeit_s=itoa(t+1,string,10);
    

    Das macht er ab 1000 nicht mehr mit.

    tschö mit ö



  • Hallo,

    ändere mal char string[4] in einen größeren Wert z.B. char string[16) um!
    In string[4] passen max. 3 Zeichen +"\0"

    Tester2


Anmelden zum Antworten