我试着做了下,如果要把修改后内容还是写回1.txt的话,难度较大,要考虑的问题较多,这样写的话程序会很复杂,我觉得做到这一点不是程序的主要目的,所以我就降低了难度,把修改后的内容写到新建的3.txt文件里,这样把问题简化了不少,而且效率也高。没有经过几M文件的测试,就是测了下楼主所提供的文件,还是测试没有问题的。平台是GCC,代码如下:
程序代码:
#include "unp.h"
#define FILE1 "./1.txt"
#define FILE2 "./2.txt"
#define FILE3 "./3.txt"
#define MAXDATASIZE 1024
#define TRUE 1
typedef struct
{
int length;
char mark;
char keyword[20];
}FILE_COMPAREINFO; //保存每个关键字的信息,有长度、首字符、保存关键字的字符数组
int main(int argc,char **argv)
{
int filelen;
int readtry,readrest;
FILE_COMPAREINFO keywordinfo[MAXDATASIZE];
char readbuff[MAXDATASIZE];
char writebuff[MAXDATASIZE];
char writedata[] = "本条数据相同的以删除";
int file1_fd;
FILE *file2_fd;
off_t set;
int file_fd;
int readbyte;
int i,j;
int infonum;
int lastoffset;
char *ptr;
for(i = 0;i < MAXDATASIZE;i ++) //初始化长度
{
keywordinfo[i].length = 0;
}
file_fd = creat(FILE3,O_RDWR); //创建文件3.txt
if((file1_fd = open(FILE1,O_RDWR)) < 0) //打开文件1.txt
{
printf("open file1 failure or this file is not exist\n");
exit(1);
}
filelen = lseek(file1_fd,0,SEEK_END); //调用函数lseek求文件1.txt的长度
readtry = filelen / MAXDATASIZE; //因为文件较大的话,每次处理1024个字节,需要处理readtry次
readrest = filelen % MAXDATASIZE; //最后一次处理的字节数为readrest
lseek(file1_fd,0,SEEK_SET);
if((file2_fd = fopen(FILE2,"r")) < 0) //打开文件2.txt的IO流
{
printf("open file2 failure or this file is not exist\n");
exit(1);
}
i = 0;
set = ftello(file2_fd);
fseeko(file2_fd,set,SEEK_SET);
while(fgets(keywordinfo[i].keyword,20,file2_fd) != NULL) //每次读一行,假设文件2.txt里的每一个关键字占一行
{
keywordinfo[i].mark = keywordinfo[i].keyword[0];
ptr = &keywordinfo[i].keyword[0];
while(*ptr != 0)
{
keywordinfo[i].length ++;
ptr ++;
}
keywordinfo[i].length -= 2;
i ++;
set = ftello(file2_fd);
fseeko(file2_fd,set,SEEK_SET);
}
infonum = i;
lastoffset = 0;
while(readtry --) //每次处理1024个字节,处理readtry次
{
readbyte = read(file1_fd,readbuff,MAXDATASIZE);
for(i = 0;i < readbyte;i ++)
{
for(j = 0;j < infonum;j ++)
{
if(readbuff[i] == keywordinfo[j].mark)
{
if(!memcmp(&readbuff[i],keywordinfo[j].keyword,keywordinfo[j].length)) //比较文件1.txt的某一个字符串是否和关键字相同
{
file_fd = open(FILE3,O_RDWR | O_APPEND);
write(file_fd,&readbuff[lastoffset],i - lastoffset);
write(file_fd,writedata,strlen(writedata));
lastoffset = i + keywordinfo[j].length;
}
}
}
}
write(file_fd,&readbuff[lastoffset],i - lastoffset); //之所以写这条语句,是和我的算法有关的,因为每次往文件3.txt里写都是在出现了
//关键字后驱动的,所以最后末尾会出现还有一串没有关键字的数据,所以要单独写
}
if(readrest > 0) //处理最后的readrest个字节,除了字节数不一样之外,其他的和上一个循环的处理方法一样
{
bzero(readbuff,MAXDATASIZE);
readbyte = read(file1_fd,readbuff,readrest);
for(i = 0;i < readbyte;i ++)
{
for(j = 0;j < infonum;j ++)
{
if(readbuff[i] == keywordinfo[j].mark)
{
if(!memcmp(&readbuff[i],keywordinfo[j].keyword,keywordinfo[j].length))
{
file_fd = open(FILE3,O_RDWR | O_APPEND);
write(file_fd,&readbuff[lastoffset],i - lastoffset);
write(file_fd,writedata,strlen(writedata));
lastoffset = i + keywordinfo[j].length;
}
}
}
}
}
write(file_fd,&readbuff[lastoffset],i - lastoffset);
printf("check over,please open file2 to see the result\n");
return;
}
unp.h文件是我自己常用的.h文件,目的就是引入一些库文件,没有其他作用,在此我就不把这个文件的内容贴出来了。如果有人感兴趣的话,我再贴吧。希望能对楼主有用,
[
本帖最后由 luyi_footman 于 2011-8-26 19:41 编辑 ]