Probleme bei Dateischreiben



  • Und zwar habe ich 4 Editboxen die mir Int-Werte liefern, die jemand da eingibt. Nun will ich die in eine Datei schreiben und absichern.

    void CTestDlg::OnConfigurationSaveconfig()
    {
    	CString value;
    	CString path;
    	int limits[4];
    
    //Werte aus DoModal holen
    	limits[0] = dLimits.iLimitMinX;
    	limits[1] = dLimits.iLimitMaxX;
    	limits[2] = dLimits.iLimitMinY;
    	limits[3] = dLimits.iLimitMaxY;
    
    	CFileDialog cDialog(FALSE, 0, 0, 4|2, _T("Config (*.ltd) |*.ltd||"), 0, 0);
    
    	if(cDialog.DoModal() == IDOK)
    	{
    		path.Format(_T("%s.ltd"),cDialog.GetPathName());
    		CFile cFile(path, CFile::modeCreate | CFile::modeWrite);
    
    		for(int i=0; i<4; i++)
    		{
    			value.Format(_T("%d \r\n"), limits[i]);
    			cFile.Write(value, sizeof(value));
    		}
    
    		cFile.Close(); 
    	}
    }
    

    Das Problem ist nun, dass ich keine "Returns" in die Datei bekomme, also die Zahlen zum einen hintereinander geschrieben werden und zum anderen werden die zahlen nach 2 stellen abgeschnitten. Das verwirrende ist, dass ich die Funktion in einem anderen Programm genau so verwende, nur dass ich dort HEX-Werte sichere. Da bekomme ich "Returns" rein und alles.

    Wo liegt mein Fehler?



  • Was machst Du denn hier????

    cFile.Write(value, sizeof(value));
    

    Du schreibst die Größe des CStrings raus? Das ist aber nicht die Länge des Strings... und es ist auch nicht der korrekte Zeigen, den Du übergibst...

    Du solltest eher sowas machen:

    cFile.Write((LPCTSTR) value, value.GetLength()*sizeof(TCHAR));
    


  • Jochen Kalmbach schrieb:

    Was machst Du denn hier????

    cFile.Write(value, sizeof(value));
    

    Du schreibst die Größe des CStrings raus? Das ist aber nicht die Länge des Strings... und es ist auch nicht der korrekte Zeigen, den Du übergibst...

    Du solltest eher sowas machen:

    cFile.Write((LPCTSTR) value, value.GetLength()*sizeof(TCHAR));
    

    welchen genauen Sinn/Zweck hat da am Ende eigentlich das "*sizeof(TCHAR)" ? Habe die Methode Write sonst immmer genauso, aber ohne das sizeof(TCHAR) verwendet. Also das sizeof die Größe angibt ist mir klar, nur der Sinn an dieser Stelle nicht.


  • Mod

    In einem Unicode Projekt hat jedes Buchstabe 2 Bytes! In einem MBCS Projekt hat jeder Buchstabe 1 Byte. sizeof(TCHAR) trägt dem Rechnung!
    Den CString ist kein char-Container sondern ein TCHAR-Container.



  • dawa85 schrieb:

    welchen genauen Sinn/Zweck hat da am Ende eigentlich das "*sizeof(TCHAR)" ? Habe die Methode Write sonst immmer genauso, aber ohne das sizeof(TCHAR) verwendet. Also das sizeof die Größe angibt ist mir klar, nur der Sinn an dieser Stelle nicht.

    Write() erwartet die Datengröße in Byte, GetLength() liefert die Stringlänge in Zeichen - sizeof(TCHAR) gibt die Größe eines Zeichens in Byte an und dient da als Umrechnungsfaktor.

    (im ANSI-Modus ist TCHAR==char und sizeof(TCHAR)==1, im UNICODE-Modus ist TCHAR==wchar_t - und der ist etwas größer)



  • Danke 🙂 Mal wieder was gelernt



  • jo danke, jetzt gehts.


Anmelden zum Antworten