免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: wibxy
打印 上一主题 下一主题

[C] 改写文件中的数据,什么方法简便高效? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-12-17 21:49 |只看该作者
mmap也未必好用,至少在win上有時使用的頁面文件太大.

论坛徽章:
0
12 [报告]
发表于 2007-12-17 23:10 |只看该作者
原帖由 xman0017 于 2007-12-17 21:16 发表
好象没有办法了,

但是我奇怪:文件操作-》系统-》磁盘操作,不是同样在读写数据吗,怎么就不能在文件中修改呢?

怎么就没有这样的系统函数呢??

有很多这样的函数啊

论坛徽章:
0
13 [报告]
发表于 2007-12-18 00:11 |只看该作者
原帖由 wibxy 于 2007-12-17 11:20 发表
创建一个临时文件,在把原文件向临时文件复制的过程中,在想改的地方改,结束后再把临时文件覆盖原文件。

我只会这个方法 --!

论坛徽章:
0
14 [报告]
发表于 2007-12-18 01:25 |只看该作者
原帖由 safedead 于 2007-12-17 11:32 发表


这个方式是标准方式,适合文件不太大,读写次数不是特别频繁的场合
简单的就是好的

你想干什么,编辑>20GB的视频文件?


相反,我认为这个适合大文件和频繁读写的情况。对于小文件,直接一次性读入缓存,更改完成后最后一次性以覆盖方式写回原文件。

实际上核心问题是:对于大文件来说,以覆盖方式和追加方式更改文件是问题不大的;而插入操作却需要消耗巨大的IO资源,因为在大文件中间位置的插入操作将导致所有后续数据的全部大搬家。
上面介绍的临时文件的方式本质上就是变插入方式为追加方式

论坛徽章:
0
15 [报告]
发表于 2007-12-18 09:14 |只看该作者
如果不是插入数据,而只是改写中间某一位置的数值,譬如,假设总文件长度为100个字节,第36个字节的数值是0x08,现在想把它改为0x16,有好方法么?

论坛徽章:
0
16 [报告]
发表于 2007-12-18 09:19 |只看该作者
一般就是这样:
如果
1)覆盖改动:那就 open, seek, 直接写.
2)插入(删除)式改动, 用临时文件, 在rename回来

全读入, 文件大些了就不好.
MMAP没有什么优势.

原帖由 wibxy 于 2007-12-18 09:14 发表
如果不是插入数据,而只是改写中间某一位置的数值,譬如,假设总文件长度为100个字节,第36个字节的数值是0x08,现在想把它改为0x16,有好方法么?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP