MFC的檔案操作
總結一下最近使用MFC寫入檔案的感想和知識的記錄。
之前也講過檔案的開啟和儲存問題,這裡算是一個小總結。
1.在指定路徑檔案中儲存資料(若該路徑檔案不存在,則自動建立)
1 CString filePath = _T("F:\\VS\\Data.txt"); //儲存檔案的路徑和檔名 2 CStdioFile myFile; //操作檔案預設的是Text模式 3 CFileException fileException; 4 if (myFile.Open(filePath, CFile::typeText | CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate), &fileException) 5 { 6//寫入檔案 7 } 8 else 9TRACE("Can't open file %s,error=%u\n", filePath, fileException.m_cause);//異常處理
這裡要注意一下CFile::modeNoTruncate的使用,通常用modeCreate模式建立和開啟一個檔案,假如這個檔案已經存在,則會清空這個已經存在的檔案內容再進行寫入,但加上modeNoTruncate的話,就不會清空這個檔案了。然後寫入前新增myFile.SeekToEnd(),直接在檔案末尾開始寫入。
2.寫入資料的幾種方法
(1)原資料型別為CString,CStdioFile建立檔案myFile:
直接使用語句 myFile.WriteString(saveData);
(2)原資料型別為CString,CFile建立檔案myFile:
1 //將CString轉為char(m_receive為儲存的資料) 2 static char str[] = ""; int count = m_receive.GetLength(); 3 for (int i = 0; i < count; i++) 4str[i] = m_receive[i]; 5 myFile.Write(str, strlen(str)); //寫入檔案 6 myFile.Flush(); //立即寫入,不緩衝 7 myFile.Close(); //檔案操作結束關閉*/
(3)在檔案中儲存中文字元(將Unicode字元轉為utf-8字元)
(這是也是我最後的實現目標,所有把完整的程式碼寫一下)
1CString filePath = _T("F:\\VS\\Data.txt"); //儲存檔案的路徑和檔名 2CStdioFile myFile; //操作檔案預設的是Text模式 3CFileException fileException; 4if (myFile.Open(filePath, CFile::typeText | CFile::modeCreate | CFile::modeReadWrite | CFile::modeNoTruncate), &fileException) 5{ 6//將Unicode字元轉為utf-8字元,這樣才能正常顯示中文 7DWORD dwFileLen = myFile.GetLength(); 8if (dwFileLen == 0) 9{ 10const unsigned char LeadBytes[] = { 0xEF, 0xBB, 0xBF }; 11myFile.Write(LeadBytes, sizeof(LeadBytes)); 12} 13int nSrcLen = (int)wcslen(saveData); 14CStringA utf8String(saveData); 15int nBufLen = (nSrcLen + 1) * 6; 16LPSTR buffer = utf8String.GetBufferSetLength(nBufLen); 17int nLen = AtlUnicodeToUTF8(saveData, nSrcLen, buffer, nBufLen); 18//AtlUnicodeToUTF8()需標頭檔案:<atlenc.h>。功能:將unicode轉換成utf-8 19buffer[nLen] = 0; 20utf8String.ReleaseBuffer(); 21myFile.SeekToEnd(); 22myFile.Write(utf8String.GetBuffer(), nLen); 23myFile.Flush(); //立即寫入,不緩衝 24myFile.Close(); //檔案操作結束關閉 25} 26else 27TRACE("Can't open file %s,error=%u\n", filePath, fileException.m_cause);//異常處理