免费注册 查看新帖 |

Chinaunix

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

求助:尝试修改文件中的部分内容出现问题 [复制链接]

论坛徽章:
0
31 [报告]
发表于 2009-02-19 00:21 |只看该作者
原帖由 白水月 于 2009-2-18 22:44 发表



如果这样的话,我觉得我的另一种方法可能效率高点。
方法:
不写到一个新的文件里面,
而是在修改之前先预读后面的内容(因为可以知道修改后和修改前的长度,
所以可以精确知道需要预读多少)。
这样 ...


当文件'超长'的时候, 把后面的预读出来现实么?

这样呢:
假设原始文件为x, 每次保存时先拷贝一份临时文件y, 然后
    在y中seek到x的x.tell(), y.truncate()抹掉修改处后面的内容
    y.write(...)新插入内容
    逐行读取x.tell()后面的内容同时y.write(...)
完事后y拷回x

论坛徽章:
0
32 [报告]
发表于 2009-02-19 08:50 |只看该作者
原帖由 白水月 于 2009-2-18 22:44 发表

最理解我的想法,
我只是一个想知道python file 里面有没有
可是实现插入功能的模块.


我把lz想复杂了,我想当然认为一个变量存储到文件里,自然是为了以后从文件里恢复它的值,这个时候采用基于对象的持久化存储还是有优势的,起码可以省略重新构造对象的开销,用起来也方便。至于说 “是实现插入功能的模块” 这个问题应该属于常识,我不知道那种语言的文件操作提供这种功能?

[ 本帖最后由 luffy.deng 于 2009-2-19 08:53 编辑 ]

论坛徽章:
0
33 [报告]
发表于 2009-02-19 13:18 |只看该作者
原帖由 luffy.deng 于 2009-2-19 08:50 发表


我把lz想复杂了,我想当然认为一个变量存储到文件里,自然是为了以后从文件里恢复它的值,这个时候采用基于对象的持久化存储还是有优势的,起码可以省略重新构造对象的开销,用起来也方便。至于说 “是实现 ...



LZ不了解文件系统也没有C基础, 解释起来就比较麻烦了。。。

论坛徽章:
0
34 [报告]
发表于 2009-02-21 00:08 |只看该作者
原帖由 Lonki 于 2009-2-19 00:21 发表


当文件'超长'的时候, 把后面的预读出来现实么?

这样呢:
假设原始文件为x, 每次保存时先拷贝一份临时文件y, 然后
    在y中seek到x的x.tell(), y.truncate()抹掉修改处后面的内容
    y.write(...)新插 ...


Thanks for your reply!

我不知有没有误解你的意思:
你说的先将x拷贝一份为y,
然后在y中seek到x.tell()(这里的x.tell()是指需要修改的部分否?我是这样理解的),
然后将y中对应位置后面的删掉,然后将x后面的(指修改了之后的内容)写入y。
最后将y拷贝回来。

不知有没有理解错,如果没有的话,我有点不明白:
为什么要拷贝一份,而不直接在源文件进行操作?
好像打开文件也是一个比较耗时的操作。

论坛徽章:
0
35 [报告]
发表于 2009-02-21 00:14 |只看该作者
原帖由 luffy.deng 于 2009-2-19 08:50 发表


我把lz想复杂了,我想当然认为一个变量存储到文件里,自然是为了以后从文件里恢复它的值,这个时候采用基于对象的持久化存储还是有优势的,起码可以省略重新构造对象的开销,用起来也方便。至于说 “是实现 ...


对与大型的文件操作,采用基于对象的储存的确是很好,就像是C++中的串行化,只用“>> ”和“<<”就行了(C中不知如何,我是在MFC中第一次见到的,C的话可能要自己来)。
不过对于一般的小文本文件的话,我觉得不用这样吧。因为数据的操作不是很频繁。

论坛徽章:
0
36 [报告]
发表于 2009-02-21 01:34 |只看该作者
原帖由 白水月 于 2009-2-21 00:08 发表


Thanks for your reply!

我不知有没有误解你的意思:
你说的先将x拷贝一份为y,
然后在y中seek到x.tell()(这里的x.tell()是指需要修改的部分否?我是这样理解的),
然后将y中对应位置后面的删掉,然 ...



在源文件操作? 怎么操作?
很多编辑器如vi都会创建一个临时文件, 一样的道理.

论坛徽章:
0
37 [报告]
发表于 2009-02-21 21:16 |只看该作者
我的意思是打开源文件,直接进行修改。
就是不进行你所说的拷贝一份y 那样。

操作:
先seek到要修改的部分,在进行实际修改之前,
先预读后面要被覆盖的,修改之后再写回去。

论坛徽章:
0
38 [报告]
发表于 2009-02-21 21:21 |只看该作者
原帖由 白水月 于 2009-2-21 21:16 发表
我的意思是打开源文件,直接进行修改。
就是不进行你所说的拷贝一份y 那样。

操作:
先seek到要修改的部分,在进行实际修改之前,
先预读后面要被覆盖的,修改之后再写回去。


之前不是说了么, 大文件的话预读后面所有行到内存就有顾虑了(完全有可能是在文件最前面插入)...

[ 本帖最后由 Lonki 于 2009-2-21 21:23 编辑 ]

论坛徽章:
0
39 [报告]
发表于 2009-02-22 23:47 |只看该作者
原帖由 Lonki 于 2009-2-21 21:21 发表


之前不是说了么, 大文件的话预读后面所有行到内存就有顾虑了(完全有可能是在文件最前面插入)...



不用预读所有行啊,只需要预读那些即将被覆盖的行即可。
例如文件内容为:
aaaaa
bbbbb
ccccc
ddddd
eeeee

假如修改bbbbb为ffffffff
那么在修改之前先预读bbbbb的下一行,
即cccccc,然后写入ffffffff(在bbbbb行处),
然后再预读ddddd,写入ccccc,
接着读eeeee,写入ddddd,最后写入eeeee。
这样的话,就只需要两行内容的内存而已。

我顾虑的是这样的话,后面的读写是否可以省略。
但是这样应该比拷贝一个副本y高效。

论坛徽章:
0
40 [报告]
发表于 2009-02-23 00:49 |只看该作者
原帖由 白水月 于 2009-2-22 23:47 发表



不用预读所有行啊,只需要预读那些即将被覆盖的行即可。
例如文件内容为:
aaaaa
bbbbb
ccccc
ddddd
eeeee

假如修改bbbbb为ffffffff
那么在修改之前先预读bbbbb的下一行,
即cccccc,然后写入 ...


LZ你在1楼自己也说过了一行太长会覆盖后面的(文件操作决定的. 目前不清楚什么现成的Module提供单纯的文件插入功能且兼顾大文件)
而临时文件中的写入操作全是append, 所以没有问题.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP