C++临时文件覆盖原文件
来源:百度知道 编辑:UC知道 时间:2024/08/23 14:18:29
1.把插入位置前的所有内容从原文件读出并写入临时文件。
2.把欲插入的内容写入临时文件。
3.把插入位置后的所有内容从原文件读出并写入临时文件。
4.用临时文件覆盖原文件。
那位牛哥可以给一个上述流程的示例吗?
先谢了!
但我不想把原文件的东西大量的读到内存里,如果文件达到一定程度,这样就可能出项内存不足的问题,我是想一个元素一个元素的从原文件读出,接着读入临时文件;
上面流程中有些操作不是很清楚,主要是临时文件的创建,还要临时文件覆盖原文件的操作;
临时文件可以直接用当时的进程号为标识,创建.
然后用一个固定大小的BUF.每次从原文件中读取这么大的串,到地方了把你新的内容插到新文件中,然后插后面的内容,都读完了后remove原文件
然后rename新文件为原文件
新文件的时候,看一下,是否存在,存在的话,就换个名,或是看下是否为有用的文件.大体就是这样的.重命名用rename这个函数,函数原型自己查一下吧.应该不是问题.
我记得外部数据排序应该会使用到相应的技术
可以找本数据结构参考一下
按照标准程序库的说明,当删除/插入只发生在容器的尾部时,应该使用vector;当删除/插入只发生在容器的首/尾部时,应该使用deque;当删除/插入操作很多,而且删除/插入不是只在容器的首尾,这时应该选择list。
但是这里也有一个问题,在使用list时,由于其迭代器只能一次移动一个位置,在有大量删除的操作时,需要大量的迭代器移动操作,因此使用list的效率会很低;list的另一个缺点是,占用空间要比同等容量大小的vector要大,这是由于list的实现需要指针,每个元素就多比vector中的元素多两个指针(双向链表),因此在每个元素都很小(几个字节),而且元素数量很大时,使用list就非常浪费空间了。
如果使用vector,那么删除中间元素会导致大量的元素移动操作,效率也不高,为了解决这个问题,我们可以这样作:使用vector容器,但是不直接删除元素,而是再申请一个临时vector,将原来vector中未删除的有用元素依次加入/保存到临时vector,然后用这个临时vector替换原来的vector,如果实现知道要删除的元素的个数,那么可以事先预留临时vector的空间,再将有用元素存到临时vector中,代码如下: #include <vector>
using namespace std;
vector myVec;
… // myVec的初始化以及其它操作
vector tempVec;
// 删除myVec中的num个元素
tempVec.reserve( myVec.size() - num ); // 预留临时ve