如何修改文件中指定的字符串?

时间:2021-10-15 22:14:22
设有一文件a.txt
其中内容如下:
abc 2315
aabd 5515
aag 9392
lljh 9993

比如我要把aabd后面的5515改成其他字符串,该怎么设计算法?
我首先想到的是把修改后的内容生成一个新的文件,但这种方法对于一个容量很大的文件来说必定很耗费时间和空间.能不能直接修改呢?

7 个解决方案

#1


这个好象比较难,除非你改的字符串长度小于或等于被改的字符串长度。

#2


直接修改是不可能的,

因为没有定位,如何修改?



如果是2进制文件还可以快一些的,

使用数据块的读取、修改、写入,

比如上面的文件就是两个串,

可以格式化写、读文件,

#3


若是改是文件大小不变,可以直接改,否则就很麻烦了

#4


www.noway.com

#5


楼主的需求是可以做到的,只不过有一点点麻烦而已。假设5515在文件偏移量100处,如果新改写的字符串加上'\0'的字符数量少于5515的字符数量,直接改写就行。如果比5515多,那就要用系统输入输出函数先把文件的长度增加两者的差值,再把后面的数据往后移,空出足够的地方,再写入,简化代码如下:(因为不知道楼主的5515是以int形式写入文件的,还是以四个字符分别写入的,我假设是以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);

#6


厉害!!!

#7


搂主的问题基本等同于在文件中插入一个字符串,c下是没有这种函数的,要想不用新文件只能将插入后的数据后移,如果文件很大,建议以4k为一次循环移动,因为windows下是以4k为一页的,即使你读写一个字符,系统也是读写出4k。

#1


这个好象比较难,除非你改的字符串长度小于或等于被改的字符串长度。

#2


直接修改是不可能的,

因为没有定位,如何修改?



如果是2进制文件还可以快一些的,

使用数据块的读取、修改、写入,

比如上面的文件就是两个串,

可以格式化写、读文件,

#3


若是改是文件大小不变,可以直接改,否则就很麻烦了

#4


www.noway.com

#5


楼主的需求是可以做到的,只不过有一点点麻烦而已。假设5515在文件偏移量100处,如果新改写的字符串加上'\0'的字符数量少于5515的字符数量,直接改写就行。如果比5515多,那就要用系统输入输出函数先把文件的长度增加两者的差值,再把后面的数据往后移,空出足够的地方,再写入,简化代码如下:(因为不知道楼主的5515是以int形式写入文件的,还是以四个字符分别写入的,我假设是以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);

#6


厉害!!!

#7


搂主的问题基本等同于在文件中插入一个字符串,c下是没有这种函数的,要想不用新文件只能将插入后的数据后移,如果文件很大,建议以4k为一次循环移动,因为windows下是以4k为一页的,即使你读写一个字符,系统也是读写出4k。