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 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);//异常处理