C语言替换文件某一行

C语言替换文件某一行

标签: 语言cfpstreamfilemfc
  5278人阅读  评论(0)  收藏  举报
  分类:
 

C语言提供了文件操作,但是替换文件的某一行比较麻烦,下面是我使用的一个方法,文件中存贮的内容如下所示:

[html]  view plain  copy
  1. 11       1122          0       1122          *          *          0          0  
  2. 22        222          0        222          *          *          0          0  
  3. 33        333          0        333          *          *          0          0   
通过使用下面的几个函数,fopen,fprintf,fscanf,fseek,ftell 。具体的函数函数原型如下所示:
[html]  view plain  copy
  1. FILE*fopen(const char*filename,const char *mode);  
  2. int fprintf(FILE*stream,const char *format,...)  
  3. int fscanf(FILE* stream,const char *format,...)  
  4. int fseek(FILE*stream,long offset,int origin)  
  5. long ftell(FILE* stream)  
首先,数据写入到文件中的是追加的形式。具体的写入代码如下所示:

主要写入时要指定每个数据的宽度,若不指定,当修改某行的数据,修改后的长度大于修改前得长度,将影响文件中的下一行。制定宽度之后,只要修改后的长度不大于制定的宽度,都不影响下面的内容。(这是注意点)

[cpp]  view plain  copy
  1. FILE *fp=fopen("clientinfo.txt","ar+");  
  2. Clientinfo info;  
  3. memset(&info,0,sizeof(Clientinfo));  
  4. 。。。。  
  5. 。。。。/*完成对info结构体的赋值*/  
  6. fprintf(fp,"%10s %10s %10d %10s %10s %10s %10d %10d",info.id,info.nickname,\  
  7.         info.online,info.pwd,info.encryp,info.ip,info.port,info.fd);  
  8. fprintf(fp,"\n");  
  9. fclose(fp);  
  10. 修改处的代码如下所示,整个代码是我在MFC中实现的:  
[cpp]  view plain  copy
  1. FILE *fp=fopen("clientinfo.txt","r+");  
  2. Clientinfo info;  
  3. long nline=0,n;  
  4. memset(&info,0,sizeof(Clientinfo));  
  5. int oldline=0;/*记录匹配位置的前一行的偏移量*/  
  6. CString str;  
  7. while((n=fscanf(fp,"%s %s %d %s %s %s %d %d",info.id,info.nickname,\  
  8.         &info.online,info.pwd,info.encryp,info.ip,&info.port,&info.fd))!=EOF)  
  9. {     
  10.       str.Format("%d",nline);  
  11.       MessageBox(str);  
  12.       if(strncmp(info.id,id,id.GetLength())==0)/*查找要修改的位置*/  
  13.       {  
  14.      oldline=nline;  
  15.       break;  
  16.       }  
  17.       nline=ftell(fp);  
  18. }  
  19.   
  20. fseek(fp,oldline,SEEK_SET);/*定位到要修改的位置,注意,这个位置是上一次读的最后,故写的时候要先写换行,第一行除外*/  
  21.     if(oldline!=0)  
  22.     {  
  23.      fprintf(fp,"\n");  
  24.     }  
  25.     fprintf(fp,"%10s %10s %10d %10s %10s %10s %10d %10d",info.id,info.nickname,\  
  26.         info.online,info.pwd,info.encryp,info.ip,info.port,info.fd);  
  27.     fprintf(fp,"\n");  
  28.     fclose(fp);  
[html]  view plain  copy
  1. 下面是修改后的数据,修改第二行,没有影响前后的数据。  
  2.         11       1122          0       1122          *          *          0          0  
  3.         22       222f          0       222f          *          *          0          0  
  4.         33        333          0        333          *          *          0          0  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值