使用CStdioFile 读写UNICODE文档



一:写文档

 

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;
		}  
	}     


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值