可以使用函数int fseek( FILE *stream, long offset, int origin )来定位你的文件指针。
文件指针的位置决定你读写文件的起始位置。
其中参数origin :表示从哪里开始偏移,值有:
SEEK_SET: 文件开头
SEEK_CUR: 当前位置
SEEK_END: 文件结尾
参数offset:表示偏移的字节数,正数表示正向偏移,负数表示负向偏移。
比如
你先读取文件内容,同时做判断,找到你要改的内容时,调用函数
fseek(fp,10L,SEEK_CUR)把文件指针移动到离当前指针位置10个字节的地方(我们假设当前位置偏移10个字节就是你要修改的起始位置);
这样你之后的读写都是从段脊这个位置开始。
不过要注意的是,你从这位置厅燃陵开始写新的内容,可以覆盖原内容,所以如果新的内容比你想覆盖的内容长的话,会把后面你想保留的内容也覆盖掉。
这种思路,你想要实现修改指定内容,扮戚还需要把修改内容之后的数据也读出来备份,再一起写进去。
所以最简单,还是直接生成新的文件替换原文件。
比较稳妥的办法是:
写方式创建一个临时文件。
将原文件逐字向临时文件拷贝,拷到你要替换的内容处,转而拷贝要替换或庆的新内容;新内容拷完后,将原文件的读指针移动到要删除的内容之后,接着继续拷贝,直到文件结束。
关闭打开的两个文件,删除原吵团中文件升山,将临时文件更名为原文件名。
为什么要这么做呢?因为你修改的部分的文件块大小新旧可能不一致,不好 *** 作。若是大小严格一致的,则可以用随机访问函数移动指针,直接写到原文件要修改的地方覆盖原数据却可。
C语言提供了文件 *** 作,但是替换文件的某一行比较麻烦,下面一个参考方法,文件中存贮的内容如下所示:
通过使用下面卖首搜的几个函数,fopen,fprintf,fscanf,fseek,ftell 。具体的函数函数原型如下所示:
FILE*fopen(const char*filename,const char *mode)
int fprintf(FILE*stream,const char *format,...)
芹瞎 int fscanf(FILE* stream,const char *format,...)
int fseek(FILE*stream,long offset,int origin)
long ftell(FILE* stream)
首先,数据写入到文件中的是追加的形式。具体的写入代码如下所示:
主要写入时要中历指定每个数据的宽度,若不指定,当修改某行的数据,修改后的长度大于修改前得长度,将影响文件中的下一行。制定宽度之后,只要修改后的长度不大于制定的宽度,都不影响下面的内容。(这是注意点)
FILE *fp=fopen("clientinfo.txt","ar+")
Clientinfo info
memset(&info,0,sizeof(Clientinfo))
。。。。
。。。。/*完成对info结构体的赋值*/
fprintf(fp,"%10s %10s %10d %10s %10s %10s %10d %10d",info.id,info.nickname,\
info.online,info.pwd,info.encryp,info.ip,info.port,info.fd)
fprintf(fp,"\n")
fclose(fp)
修改处的代码如下所示,整个代码是在MFC中实现的:
FILE *fp=fopen("clientinfo.txt","r+")
Clientinfo info
long nline=0,n
memset(&info,0,sizeof(Clientinfo))
int oldline=0/*记录匹配位置的前一行的偏移量*/
CString str
while((n=fscanf(fp,"%s %s %d %s %s %s %d %d",info.id,info.nickname,\
&info.online,info.pwd,info.encryp,info.ip,&info.port,&info.fd))!=EOF)
{
str.Format("%d",nline)
MessageBox(str)
if(strncmp(info.id,id,id.GetLength())==0)/*查找要修改的位置*/
{
oldline=nline
break
}
nline=ftell(fp)
}
fseek(fp,oldline,SEEK_SET)/*定位到要修改的位置,注意,这个位置是上一次读的最后,故写的时候要先写换行,第一行除外*/
if(oldline!=0)
{
fprintf(fp,"\n")
}
fprintf(fp,"%10s %10s %10d %10s %10s %10s %10d %10d",info.id,info.nickname,\
info.online,info.pwd,info.encryp,info.ip,info.port,info.fd)
fprintf(fp,"\n")
fclose(fp)
下面是修改后的数据,修改第二行,没有影响前后的数据。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)