總結一下最近使用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 9 TRACE("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++) 4 str[i] = m_receive[i]; 5 myFile.Write(str, strlen(str)); //寫入文件 6 myFile.Flush(); //立即寫入,不緩沖 7 myFile.Close(); //文件操作結束關閉*/
(3)在文件中保存中文字符(將Unicode字符轉為utf-8字符)
(這是也是我最后的實現目標,所有把完整的代碼寫一下)
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 //將Unicode字符轉為utf-8字符,這樣才能正常顯示中文 7 DWORD dwFileLen = myFile.GetLength(); 8 if (dwFileLen == 0) 9 { 10 const unsigned char LeadBytes[] = { 0xEF, 0xBB, 0xBF }; 11 myFile.Write(LeadBytes, sizeof(LeadBytes)); 12 } 13 int nSrcLen = (int)wcslen(saveData); 14 CStringA utf8String(saveData); 15 int nBufLen = (nSrcLen + 1) * 6; 16 LPSTR buffer = utf8String.GetBufferSetLength(nBufLen); 17 int nLen = AtlUnicodeToUTF8(saveData, nSrcLen, buffer, nBufLen); 18 //AtlUnicodeToUTF8()需頭文件:<atlenc.h>。功能:將unicode轉換成utf-8 19 buffer[nLen] = 0; 20 utf8String.ReleaseBuffer(); 21 myFile.SeekToEnd(); 22 myFile.Write(utf8String.GetBuffer(), nLen); 23 myFile.Flush(); //立即寫入,不緩沖 24 myFile.Close(); //文件操作結束關閉 25 } 26 else 27 TRACE("Can't open file %s,error=%u\n", filePath, fileException.m_cause);//異常處理
