总结一下最近使用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);//异常处理

 

版权声明:本文为Ivy-yang原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/Ivy-yang/p/tuzi-CFile.html