Settings in Datei schreiben



  • Ich habe aus einem Tutorial folgenden Code:

    void CPMDToolboxDlg::SaveSettings()
    {
    	CFile dataFile;
    	char strFilter[] = { "Textfiles (*.txt)|*.txt|All Files (*.*)|*.*||"};
    	CFileDialog FileDlg(FALSE, ".txt", NULL, 0, strFilter);
    
    	if (FileDlg.DoModal()==IDOK)
    	{
    		if (dataFile.Open(FileDlg.GetFileName(), CFile::modeCreate| CFile::modeWrite)==FALSE)
    			return;
    		CArchive ar(&dataFile, CArchive::store);
    
    		ar << m_iPort;
    		ar << m_iDataMode;
    		ar << m_iDistMin;
    		ar << m_iDistMax;
    		ar << m_iExposure;
    		ar << m_iFPS;
    	}
    		return;
    	dataFile.Close();
    }
    

    Da ich nicht jedesmal den Dialog sehen will, habe ich es geändert:

    void CPMDToolboxDlg::SaveSettings()
    {
    	CFile dataFile;
    
    	if (dataFile.Open("settings.dat", CFile::modeCreate| CFile::modeWrite)==FALSE)
    		return;
    	CArchive ar(&dataFile, CArchive::store);
    
    	ar << m_iPort;
    	ar << m_iDataMode;
    	ar << m_iDistMin;
    	ar << m_iDistMax;
    	ar << m_iExposure;
    	ar << m_iFPS;
    
    	dataFile.Close();
    }
    

    Im dataFile.Close bekomme ich nun aber eine Exception. Oben fällt mir dieses alleinstehende return am Ende auf. Kann man da das "else" etwa weglassen (wohl eher nicht, wenn ich genau überlege, muss ein Fehler im Tutorial sein)? Schreibe ich das return vor mein dataFile.Close (im geänderten Code), dann kommt die Exception nicht mehr, aber die Datei wird nicht geschlossen. Ich verstehe grad nicht was da genau passiert.


  • Administrator

    Hmmm würde ich sowieso alles ein wenig anderst schreiben:

    void CPMDToolboxDlg::SaveSettings()
    {
        CFile dataFile;
    
        if(dataFile.Open("settings.dat", CFile::modeCreate | CFile::modeWrite))
        {
            CArchive ar(&dataFile, CArchive::store);
    
            ar << m_iPort << m_iDataMode << m_iDistMin << m_iDistMax << m_iExposure << m_iFPS;
    
            ar.Close();
            dataFile.Close();
        }
    }
    

    So sollte des eigentlich funktionieren.
    Grüssli



  • Vielen Dank! Dann fehlte das ar.Close() und das serielle Schreiben sieht auch besser aus 🙂


Anmelden zum Antworten