比如说,我用链表往文件里写入10条记录,如果我想把第八条删掉,我应该怎么做?我刚开始的思路是把链表一个一个的读进来,再写回去,可是感觉这样没有效率啊,又想不出更好的办法了,请各位给点儿意见!
如果还没有写到文件中去
那很简单
对连表进行修改
之后再写入文件就好了
OK !
如果已经写入文件了
需要修改的是文件的内容
有两种办法
1 就是你说的
读取文件内容 -》 修改 -》 重新写文件
2 上面的是很麻烦
可以使用下面的办法来简化
由于使用的是连表
我们可以确定 接点的结构
那么文件中数据的 位置我们也是可以计算的!
我们可以直接修改目标数据就好了
如下 讲解:
假设5515在文件偏移量100处,如果新改写的字符串加上\0的字符数量少于5515的字符数量,直接改写就行。如果比5515多,那就要用系统输入输出函数先把文件的长度增加两者的差值,再把后面的数据往后移,空出足够的地方,再写入,简化代码如下:
#include<io.h>
#include<string.h>
int i,iFile;
long lSub,lNewLength,lFileSub,lFileLength;
char string[]="abcdef"; //假设这是改写字符串,并且长度大于5515
char temp;
iFile=open("test.dat",O_RDWR); //以可读可写方式打开文件
lSub=strlen(string)-4+1; //4是5515字符数量,差值包括\0;
lseek(iFile,0l,SEEK_END);
lFileSub=tell(iFile)-100-4+1; //算出5515后面的字节数量;
lFileLength=filelength(iFile);
lNewlength=lFileLength+lSub;
chsize(iFile,lNewlength); //增加文件test.dat的长度,原文件末尾多出来的lSub个字节会自动
以\0填充
for(i=0;i<lFileSub;i++)
{
lseek(iFile,-i-lSub,SEEK_END);
read(&temp,sizeof(char),1,iFile);
lseek(iFile,-i,SEEK_END);
write(&temp,sizeof(char),1,iFile);
} //移动末尾的字节块。本来想一次过用malloc移动整块字节块的,但
想到楼主文件可能很大,不一定能分配到足够的内存,所以还是一
个一个字节地移动。
lseek(iFile,100l,SEEK_SET);
write(string,sizeof(char),strlen(string)+1,iFile);
close(iFile);