C语言提供了文件操作,但是替换文件的某一行比较麻烦,下面是我使用的一个方法,文件中存贮的内容如下所示:
- 11 1122 0 1122 * * 0 0
- 22 222 0 222 * * 0 0
- 33 333 0 333 * * 0 0
通过使用下面的几个函数,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));
- 。。。。
- 。。。。
- 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