MFC读取和存储大文件

忆朵小花 2014-09-15 04:11:02
我用VS2010 MFC写了一个工具,从一个文件1中读取数据,放到另外一个文件2中。当文件1中的数据比较少时,程序执行,当文件达到几M的时候,程序就不能响应了,不能进行读取了。需要怎么做,可以读取相对比较大的数据,几十M,几百M。。
...全文
469 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
忆朵小花 2014-09-28
  • 打赏
  • 举报
回复
引用 7 楼 happyparrot 的回复:
对CString的数据进行处理 ==千万不要对大字符串使用CString进行处理!CString只能用来处理短字符串,因为它封装了大量的内存操作,Left,Right,Mid等函数非常耗时,每次都要重新申请内存进行内存复制。 ==大字符串处理,请直接用指针,通过指针移动来截取,效率最高!
分块处理,速度比较慢。内存映射文件,没试用过。使用指针比较方便,读出来了。 给力
忆朵小花 2014-09-17
  • 打赏
  • 举报
回复
mfc_file.Open(str_edit2,CFile::modeCreate | CFile::modeReadWrite|CFile::modeNoTruncate); 我用追加方式打开文件。
int pos1 = strXML.Find("<Data>");
int pos2 = strXML.Find("</Data>");
int len = pos2 - pos1;
[code=c]
for(i=pos1;i<strXML.GetLength();i+len) { for(i=pos1;i<pos2;i++)[/code] { //在出现第一个<Data>与</Data>之间查找我所需要的数据,查找到一条,写进去一条道str_edit2中。 } 为何我的文件会一直写下去,存储数据的文件比源文件还大,还在不断增加。
yjmshpz 2014-09-17
  • 打赏
  • 举报
回复
如果文件可以分段处理的话,大文件最后分段处理
笨笨仔 2014-09-17
  • 打赏
  • 举报
回复
如果文件不需要筛选,应该使用文件拷贝方式。 大文件必须分块完成
副组长 2014-09-16
  • 打赏
  • 举报
回复
当文件达到几M的时候,程序就不能响应了,不能进行读取了? 你要是几个G还可能是文件太大性能下降的问题,几个M不可能的,自己找吧。 估计是你把数据缓冲区建到了栈上,就像楼上诸位说的。
-小仙- 2014-09-16
  • 打赏
  • 举报
回复
引用 6 楼 woheduole 的回复:
当文件达到几M的时候,程序就不能响应了 , 你是读到栈中了? 栈的空间没这么大. 你要是new出来的空间, 读几百兆都没问题. 贴代码看看. 估计是你代码问题
栈里面,不是慢是会溢出,应该放在堆里面,也就是new出来的。
引用 7 楼 happyparrot 的回复:
对CString的数据进行处理 ==千万不要对大字符串使用CString进行处理!CString只能用来处理短字符串,因为它封装了大量的内存操作,Left,Right,Mid等函数非常耗时,每次都要重新申请内存进行内存复制。 ==大字符串处理,请直接用指针,通过指针移动来截取,效率最高!
直接 unique_ptr<TCHAR[]> m_pBuf(new TCHAR[20480]);
快乐鹦鹉 2014-09-16
  • 打赏
  • 举报
回复
对CString的数据进行处理 ==千万不要对大字符串使用CString进行处理!CString只能用来处理短字符串,因为它封装了大量的内存操作,Left,Right,Mid等函数非常耗时,每次都要重新申请内存进行内存复制。 ==大字符串处理,请直接用指针,通过指针移动来截取,效率最高!
我喝多了 2014-09-16
  • 打赏
  • 举报
回复
当文件达到几M的时候,程序就不能响应了 , 你是读到栈中了? 栈的空间没这么大. 你要是new出来的空间, 读几百兆都没问题. 贴代码看看. 估计是你代码问题
lx624909677 2014-09-16
  • 打赏
  • 举报
回复
直接用CopyFile来做会慢吗?
忆朵小花 2014-09-15
  • 打赏
  • 举报
回复
引用 2 楼 happyparrot 的回复:
可以用内存映射文件进行读取,把硬盘当内存用。
我先把文件1的数据read到动态数组数组中,read完之后,将数组的内容全部复制给CString,对CString的数据进行处理,得到想要得到的数据放在CString2中,把CString2的大数据write到文件2中。数据太多,就卡死了。
SiGoYi 2014-09-15
  • 打赏
  • 举报
回复
具体不知道楼主代码怎么写的,但感觉是楼主在一个函数中使用的栈内存过大导致的,楼主在使用空间是是否是使用数组?如果是的话把数组改成new就应该可以了。
快乐鹦鹉 2014-09-15
  • 打赏
  • 举报
回复
可以用内存映射文件进行读取,把硬盘当内存用。
-小仙- 2014-09-15
  • 打赏
  • 举报
回复
按帧读取,一帧大小可以调试决定要多大,然后边从文件1读取,边往文件2中存放! 而不是一次性读取,一次性写入!

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧