码迷,mamicode.com
首页 > 其他好文 > 详细

使用CStdioFile 读写UNICODE文档

时间:2015-04-24 22:32:26      阅读:294      评论:0      收藏:0      [点我收藏+]

标签:

转自 http://blog.csdn.net/shuilan0066/article/details/6996310

一:写文档

 

1  创建文档并写入内容

CString filePath=L"C:\\unicode.txt";

CStdioFile wfile;
if (!wfile.Open(filePath,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary))
{
AfxMessageBox(L"文件无法修改");
return;
}

WORD sign=0xfeff; // unicode文档 标志
wfile.Write(&sign,2);

CString fileContent;
fileContent=L"UNICODE文档";

wfile.Write(fileContent.GetBuffer(),fileContent.GetLength()*2);
fileContent.ReleaseBuffer();

wfile.Close();

-----------------------------------

WORD sign=0xfeff;
wFile.Write(&sign,2);

//遍历list容器 写入文件
list<CString>::iterator it=fileList.begin();
for (it=fileList.begin();it!=fileList.end();it++)
{
str=*it;
//写入CString类型的字符串
wFile.Write(str.GetBuffer(),str.GetLength()*2);
str.ReleaseBuffer();

//使用WriteString 写入回车换行符
wFile.WriteString(L"\r\n");
}

wFile.Close();

 

2  判断文档是否存在,若存在,则在文档末尾添加内容,若不存在,重新创建

CString filePath=L"c:\\test.txt";

CStdioFile wfile;
CFileFind fileFind;

if(!fileFind.FindFile(filePath) // 查找文件是否存在
{
if (!wfile.Open(filePath,CFile::modeWrite|CFile::modeCreate|CFile::typeBinary)) //unicode 必须以二进制打开
return ;
WORD sign=0xfeff;
wfile.Write(&sign,2);

}else
if (!wfile.Open(filePath,CFile::modeWrite|CFile::modeNoTruncate|CFile::typeBinary))
return ;


WORD sign;

wfile.SeekToBegin();
wfile.Read(&sign,2);

if (sign!=0xfeff)
{
AfxMessageBox(L"不是UNICODE文档");
return;
}

wfile.SeekToEnd();
CString str=L"添加到文档末尾";
wfile.Write(str.GetBuffer(),str.GetLength()*2);
str.ReleaseBuffer();
wfile.Close();

 

二 读文档:

1 使用Read函数 读取文档 ,并将读取到的内容转换为CString 以方便处理

CString filepath;
CStdioFile wfile;

filepath=L"c:\\test.txt";

if (!wfile.Open(filepath,CFile::modeRead|CFile::typeBinary))
{
AfxMessageBox(L"无法打开文件");
return ;
}

ULONGLONG len=wfile.GetLength();
byte *pByte=NULL;

if (len>0)
{
pByte=new byte[len];
memset(pByte,0,len*sizeof(byte));
WORD sign;
wfile.SeekToBegin();
wfile.Read(&sign,2);

if (sign!=0xfeff)
{
AfxMessageBox(L"录入文件不是Unicode");
}else{
wfile.Read(pByte,len-2);
}
}else{

AfxMessageBox(L"文件长度为0 ");
return;
}

CString buf=(WCHAR*)pByte; // 将数组转换为 CString类型
wfile.Close();

// 其他操作
//...
//

delete [] pByte; // 释放资源

 

2 使用 ReadString  读取一行文本

 

virtual LPTSTR ReadString(
   LPTSTR lpsz,
   UINT nMax 
);
virtual BOOL ReadString(
   CString& rString
);

 

// 读取到换行符\n为止,且读取的字符少于nMax-1时,将换行符 \n 保存到缓冲区中

Reading is stopped by the first newline character. If, in that case, fewer than nMax–1 characters have been read, a newline character is stored in the buffer. A null character (‘\0‘) is appended in either case.

 

注意:

The CString version of this function removes the ‘\n‘ if present; the LPTSTR version does not.

 

ReadString(CString & rString)  中, rString   为:  一行文本+结尾符       

但结尾是 回车符 ‘\r‘  而不是‘\r\n‘  

 

因此,若想得到这一行数据,还必须将结尾符去掉方可。

 

示例:

WORD sign;
readFile.SeekToBegin();
readFile.Read(&sign,2);
if (sign!=0xfeff)
{
AfxMessageBox(L"file.txt 不是Unicode");
}else{

CString str;

//读取文件
while (readFile.ReadString(str)) // 此时,获得的str字符串 含有回车符\r 但是不含换行符\n
{
// 去掉 回车符 \r 获得不含回车换行符的纯粹的字符串数据
str=str.Left(str.GetLength()-1);
m_filePathMap.SetAt(str,0);
}
}

 

一个综合例子:

CFileDialog dlg(
TRUE,
_T("*"),
_T("*.txt"),
OFN_FILEMUSTEXIST|OFN_HIDEREADONLY|OFN_ALLOWMULTISELECT,
_T("All Files(*.txt|*.txt||)")
);
TCHAR szbuffer[1024];
szbuffer[0]=0;
dlg.m_ofn.lpstrFile = szbuffer;
dlg.m_ofn.nMaxFile = 1024;

if(IDOK==dlg.DoModal())
{
POSITION pos = dlg.GetStartPosition();
CString filepath;
CStdioFile wfile;

while(pos!=NULL)
{
filepath = dlg.GetNextPathName(pos);

if (!wfile.Open(filepath,CFile::modeReadWrite|CFile::typeBinary))
{
AfxMessageBox(L"无法打开文件");
return ;
}

ULONGLONG len=wfile.GetLength();

CString strTxt;
byte *pByte=NULL;

if (len>0)
{
pByte=new byte[len];
WORD sign;
wfile.SeekToBegin();
wfile.Read(&sign,2);

if (sign!=0xfeff)
{
AfxMessageBox(L"录入文件不是Unicode");
}else{

pByte[len-1]=0;
pByte[len-2]=0;
wfile.Read(pByte,len-2);
EraseTxtMark(pByte,len);
}
}


CString buf=(WCHAR*)pByte;
wfile.Close();

if (!wfile.Open(filepath,CFile::modeReadWrite|CFile::typeBinary|CFile::modeCreate))
{
AfxMessageBox(L"无法打开文件");
return ;
}
wfile.SeekToBegin();
WORD sign=0xfeff;
wfile.Write(&sign,2);
wfile.Write(buf.GetBuffer(),buf.GetLength()*2);
wfile.Close();
delete [] pByte;
}
}

 

使用CStdioFile 读写UNICODE文档

标签:

原文地址:http://www.cnblogs.com/gamekk/p/4454577.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!