利用C语言替换文件中某一行的方法

所属分类: 软件编程 / C 语言 阅读数: 57
收藏 0 赞 0 分享

文件中存贮的内容如下所示:

11    1122     0    1122     *     *     0     0 
22    222     0    222     *     *     0     0 
33    333     0    333     *     *     0     0  

通过使用下面的几个函数,fopenfprintffscanffseekftell

具体的函数函数原型如下所示:

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); 

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

    11    1122     0    1122     *     *     0     0 
    22    222f     0    222f     *     *     0     0 
    33    333     0    333     *     *     0     0

利用C语言替换文件中某一行的方法到这就基本结束了,大家都学会了吗?希望这篇文章的内容对大家的学习和工作能带来一定的帮助,如果有疑问,大家可以留言交流。

更多精彩内容其他人还在看

C++中四种对象生存期和作用域以及static的用法总结分析

以下是对C++中四种对象生存期和作用域以及static的用法进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++嵌套类与局部类详细解析

从作用域的角度看,嵌套类被隐藏在外围类之中,该类名只能在外围类中使用。如果在外围类之外的作用域使用该类名时,需要加名字限定
收藏 0 赞 0 分享

C++空类详解

以下是对C++中的空类进行了详细的介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C++之友元:友元函数和友元类详解

友元是一种允许非类成员函数访问类的非公有成员的一种机制。可以把一个函数指定为类的友元,也可以把整个类指定为另一个类的友元
收藏 0 赞 0 分享

C++中返回指向函数的指针示例

int (*ff(int)) (int *,int);表示:ff(int)是一个函数,带有一个int型的形参,该函数返回int (*) (int *,int),它是一个指向函数的指针,所指向的函数返回int型并带有两个分别是Int*和int型的形参
收藏 0 赞 0 分享

C数据结构之单链表详细示例分析

以下是对C语言中的单链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

C数据结构之双链表详细示例分析

以下是对c语言中的双链表进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅析如何在c语言中调用Linux脚本

如何在c语言中调用Linux脚本呢?下面小编就为大家详细的介绍一下吧!需要的朋友可以过来参考下
收藏 0 赞 0 分享

深入解析unsigned int 和 int

以下是对unsigned int和int进行了详细的分析介绍,需要的朋友可以过来参考下
收藏 0 赞 0 分享

浅谈C++中的string 类型占几个字节

本篇文章小编并不是为大家讲解string类型的用法,而是讲解我个人比较好奇的问题,就是string 类型占几个字节
收藏 0 赞 0 分享
查看更多