打印

文件操作问题

[复制链接]
1109|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
秋天落叶|  楼主 | 2012-6-14 17:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个问题卡了我很久了,之前问过很多遍了,一直没得到满意答复,求高手指点。。万分感谢。下面我描述小我的问题。
1。目的:我的目的是实现文件读写,编辑功能。我会在文件中间插入一些我想要加入的文本。但不影响原有的文件编码方式,比入 ANSI UTF-8 ,等等。对于要加入文本的位置,我是通过查找原文件中的关键字来确定插入位置的。
2。我的处理是,用二进制方式读写的。 fopen(fp,"rb)打开文件,然后fread 到 char* buffer,然后查找修改位置,用
char* pinsert = strstr(buffer, "我要找到你"); 最后通过fopen(fp,"wb"); 将处理后的数据写回文件。
=================================================================================================
我的代码大致如下:
==============================================================================================
FILE *fp;
fp= fopen( "file path", "rb" );
if(!fp)
{
return ;
}
long len,len2;
fseek(fp,0,SEEK_END);
len = ftell(fp);
fseek(fp,0,SEEK_SET);
char* data;
char* file_buf = NULL;
if( len )
{
file_buf = new char[len+1];
if(file_buf)
{
file_buf[len] = L'\0';
fread(file_buf,1,len,fp);
data = file_buf;
}
fclose(fp);
}
else
{
// empty file
fclose(fp);
return;
}

if (NULL == data)
{
TRACE("data is NULL\n");
delete [] file_buf;
return;
}

=============================
通过查找关键字定位要编辑的位置。
const char* pstrKeyword = "我要找到你";
char * pdata = strstr(data,pstrKeyword); 
用3个指针标记文件
char* pUp  数组中 0 到 pdata  部分 长度len2
char* pIn 要插入的数据
char* pdata pdata 到buffer数据结尾

================================
最后写数据
fp= fopen( "file path", "wb" );
fwrite(pUp,1,len2,fp);
fprintf(fp,"%s\n",pIn);
fwrite(pdata,1,(len-len2),fp);
=======================================================================

3. 为了支持带汉字的路径我将fopen 替换为 _wfopen了。其他处理不变,依然正常使用。

4。但我将其他的cahr版本的api替换为宽字节版本的,并用wchar_t* buffer来存储读入的文件数据,这时候 TCHAR * pstr = wcsstr ( buffer,L"我要找到你"); 就无法查到我要找的关键字了。

问题:谁能帮我解答这是为什么呢,我之前用char 版本的api处理有什么潜在问题么?如果有潜在问题,如何解决好呢。
另外,很多工具支持多种编码,比如editplus,秀丸 。。并用CTRL+F 来查找关键字,像这些编辑工具是怎么实现查找关键字的的呢。

相关帖子

沙发
yybj| | 2012-6-14 17:22 | 只看该作者
思路不对,读入内存,在内存中进行修改,写回。最简单的就是读到一个string中。修改string,写会string

使用特权

评论回复
板凳
baidudz| | 2012-6-14 18:01 | 只看该作者
utf-8编码本身就复杂,你得解码才能知道字符间断处
而且文件操作无法直接插入

使用特权

评论回复
地板
sinadz| | 2012-6-14 22:00 | 只看该作者
一般文件编辑器都是内存映射做的,文件是顺序的,只能覆盖不能插入与删减,除非它们像内存一样轻松移动

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:落叶很美

138

主题

3044

帖子

1

粉丝