当前位置:C++技术网 > 资讯 > c和c++中如何实现对已存入文件的内容进行修改?

c和c++中如何实现对已存入文件的内容进行修改?

更新时间:2017-04-16 14:25:01浏览次数:1+次

比如我想对存入文件的内容进行排序,删除等操作应该怎么实现?

目前我能想到的办法就是先将文件中的内容全部读取出来再对它们进行修改然后再写入到文件当中,可遇到数据较多的问题时,这样处理的效率会很低。有没有更好的办法?


C++技术网会员解答:

    您好,感谢您对C++技术网的支持与信任。

    文件是存储的磁盘中的数据。对文件的操作就是我们所说的IO操作。磁盘是低速设备,内存是高速设备。

    对文件内容的排序删除修改等,一般的做法都是先将文件内容读取到内存,然后再内存中进行增删改查。待增删改查完毕之后,再写入到文件存储。我们对文件的增删改查操作都是发生在内存的。但是当数据量很多的时候,确实有一些问题。

    如果文件大小在几十MB范围内,直接加载到内存还是可以接受的。但是如果文件大小有几百MB甚至上G,那么直接全部载入内存是不现实的。一来是没有那么大的内存可供使用。假如一个机器就1G内存,你加载1G文件数据到内存,内存都不够文件大。因为系统还有其他程序都要占用一部分内存。

    我们对大文件有一种处理技术,叫做内存映射文件。内存映射文件是直接将文件关联映射到内存,而不是直接将文件加载到内存。在内存中,划分一段内存,关联到磁盘上的文件,就和系统的内存交换文件(页文件)一样的效果。当你在内存操作文件时,系统发现内存中不存在这部分文件数据,就可以自动的加载对应的数据。当映射的内存用完了,就可以将内存的数据写回到磁盘文件中。而对文件的载入内存和写回到文件的控制策略,不再是直接对文件的操作,而是高于文件操作层面,系统会集中的进行文件的读写,只有在必须进行IO操作的时候,才进行IO操作。这样可以大大提高文件操作的效率。

    同时,你操作文件就跟操作内存一样的。你不需要考虑具体的文件操作。当文件映射到内存后,你得到的是一个内存起始地址。对映射部分的文件的操作,就跟内存操作一样,而内存操作产生的文件的读写,我们则不需要关心了。系统保证很高效的IO。

    当然,你也可以手动刷新,强制将内存的内容写入到文件中。一般情况都会自动的处理。我们所需要管理的就是将文件映射好,然后就可以做我们想要的增删改查工作。

    内存映射文件技术的详细解释,请阅读:《C++文件加密解密功能的实现过程详细分析3:内存映射文件技术加速大文件的处理》。