你平时应该有这样的经历,打开一个.txt格式的小说,在里面删除几个字,系统反应却很慢,这是为什么呢?因为文件里的内容都是在硬盘上按顺序一个字节挨着一个字节摆放的,读取文件的时候,会从文件首地址一直读到文件结束标记“-1”。如果能够直接把文件里面的几个字节删掉,那么下次这个文件怎么读呢?怎么区分中间那几个字节被删掉了呢?所以对于这些简单的文件来说,要想直接删除里面的内容是不可能的。
一般有两个方法实现这个功能:
1.把要保留的内容写到另一个文件中,要删掉的内容就不用写了。
2.把要保留的内容存储到一个字符串变量中,要删掉的内容不用存储,最后把这个字符串再写回到原文件中覆盖原来的内容。
例程:
#include
struct data
{
int bianhao;
char fenlei[10];
char ming[12];
int shijian[3];
float jiage;
}
void del(int num){//定义删除指定编号的内容的函数
FILE *f1;//操作的文件
long length;//文件总长度
char *f2;//用于记录要保存的内容
char s[100];//用于保存每次读取的一行内容
int n;//用于存储编号
f1=fopen("data.txt","r");//以读的方式打开文件
fseek(f1,0,2);//文件指针移到文件尾
length=ftell(f1);//取得文件长度
f2=(char *)malloc(sizeof(char)*length);//给f2分配文件长度的空间
*f2=0;//使得f2字符串的长度初始为0
rewind(f1);//文件指针回到文件头
while(ftell(f1)fgets(s,100,f1);//读取一行信息
n=atoi(s);//从读取的信息取得编号
if(n==num) continue;//如果编号是要删除的编号,就不用保存这一行信息了
strcat(f2,s);//保存读取到的这一行信息
}
fclose(f1);//关闭文件
f1=fopen("data.txt","w");//重新以写的方式打开文件
fputs(f2,f1);//把保存的信息重新存储到文件当中
fclose(f1);//关闭文件
}
int main(){
del(1); //调用上面定义的函数删除指定编号的内容
del(3); //参数为编号
system("pause");//暂停一下
}
把要删除记录的后续记录读进来,在从要删除的位置写回去.不就把要删除的数据给覆盖了吗.
文本还行,二进制文件就不行了.
如果是文本直接寻找\n就行.
用正则表达式来判断!