怎么用C语言对文件 *** 作用特定内容替换其中某些内容

怎么用C语言对文件 *** 作用特定内容替换其中某些内容,第1张

如果只想修改文件一部分。

可以使用函数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)

下面是修改后的数据,修改第二行,没有影响前后的数据。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12221209.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存