首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于文件读写操作解决方法

2012-06-15 
关于文件读写操作解决办法关于文件读写操作最近做了个程序设计到文件读写,有些地方不明,希望共同探讨对于

关于文件读写操作解决办法
关于文件读写操作
最近做了个程序设计到文件读写,有些地方不明,希望共同探讨

对于要修改的文件,怎么能不影响原有的文件编码方式,比入 ANSI UTF-8 ,等等。
我目前是用二进制方式读写的。 fopen(fp,"rb) ,fopen(fp,"wb");要写入的数据在CString。可以包含汉子。我通过WideCharToMultiByte转换成char * ,因为我用的是vs2005工程,支持unicode,用fwrite写的时候buffer 定的是char* 类型,所以要做下转换,转换后,可以正常写入到文件,没发现错误。 出了我这种处理有没有更好的方式,我这么处理,有什么潜在的问题么?
一些文本工具都支持多种编码,比如editplus,秀丸 。。 这些工具在文件处理上有什么特别么。另外在实做的过程中,我遇到这样的一个问题,我用_wfopen 支持UNICODE的 C函数处理文件 ,要修改的文件编码假定是ANSI ,我用fread 将文件读入到TCHAR* buffer 中。 然后我用wcsstr 查找关键字L"我要找到你"。
TCHAR * pstr = wcsstr ( buuffer,L"我要找到你"); 但这时候什么也查不到。 明明文件中存有关键字,但检索不到。 而用fread 将文件读入到 char* buffer中,用strstr查找,就可以查到。这是不是文件编码导致的呢?  

有什么好的方法解决么?



[解决办法]
用CString查找。不管是单字节还是多字节都可以支持。
[解决办法]
// 文件主要有Unicode和多字节两种,需要判断是否是多字节,多字节要弹出语言选择对话框
CFileStatus sts;
if ( !CFile::GetStatus(m_strDoc,sts) )
return HP_ERR_OPENFILE;

if( (sts.m_attribute & 0x01) == 0x01 ) //非正常文件
return HP_ERR_OPENFILE;

FILE *fp = NULL;
BOOL bUnicode = FALSE;

bUnicode = CStdioFileEx::IsFileUnicode(m_strDoc);
fp = _tfopen(m_strDoc, bUnicode ? _T("rb") : _T("rt") );

if( fp == NULL )
return HP_ERR_OPENFILE;

#ifdef _UNICODE
char* old_locale = NULL;
if ( !bUnicode )
{
//unicode下读取Ansi文件,需要设定区域,否则多字节字符将无法准

确读出
AFX_MANAGE_STATE(AfxGetStaticModuleState());

CDlgSetLang dlg; // 弹出语言设置对话框
if ( IDOK == dlg.DoModal() )
{
old_locale = _strdup( setlocale(LC_CTYPE,NULL) ); 
setlocale( LC_CTYPE,dlg.m_szLang); 
}
else
{
fclose(fp);
return FALSE;
}
}
#endif
// 进行读数据操作
fread(...)
fclose( fp );
[解决办法]
宽字符知道是Unicode编码的,所占的空间也是你原来的一倍,比如你buffer中 存的“ab”占两个字节,你查找b能找到,但是如果是用宽字节的函数,那么ab就编程一个字符了,你再找b就找不到了。。。关于宽字节楼主可以看看windows程序设计,中有对unicode详细的介绍。。。
[解决办法]
编码utf-8是RFC 3629 针对多国语言的(包括中文),
MFC里的话用CFile最简单,处理文件里方便
editplus 秀丸 dw等工具改的是文件编码类型
最好都统一,因为在处理包含中文内容时可能会出错

热点排行