其中内容如下:
abc 2315
aabd 5515
aag 9392
lljh 9993
比如我要把aabd后面的5515改成其他字符串,该怎么设计算法?
我首先想到的是把修改后的内容生成一个新的文件,但这种方法对于一个容量很大的文件来说必定很耗费时间和空间.能不能直接修改呢?
7 个解决方案
#1
这个好象比较难,除非你改的字符串长度小于或等于被改的字符串长度。
#2
直接修改是不可能的,
因为没有定位,如何修改?
如果是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);
#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进制文件还可以快一些的,
使用数据块的读取、修改、写入,
比如上面的文件就是两个串,
可以格式化写、读文件,
因为没有定位,如何修改?
如果是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);
#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。