文件中存贮的内容如下所示:
1
2
3
|
11 1122 0 1122 * * 0 0
22 222 0 222 * * 0 0
33 333 0 333 * * 0 0
|
通过使用下面的几个函数,fopen
,fprintf
,fscanf
,fseek
,ftell
。
具体的函数函数原型如下所示:
1
2
3
4
5
|
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)
|
首先,数据写入到文件中的是追加的形式。
具体的写入代码如下所示:
主要写入时要指定每个数据的宽度,若不指定,当修改某行的数据,修改后的长度大于修改前得长度,将影响文件中的下一行。制定宽度之后,只要修改后的长度不大于制定的宽度,都不影响下面的内容。(这是注意点)
1
2
3
4
5
6
7
8
9
|
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中实现的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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);
|
下面是修改后的数据,修改第二行,没有影响前后的数据。
1
2
3
|
11 1122 0 1122 * * 0 0
22 222f 0 222f * * 0 0
33 333 0 333 * * 0 0
|
总结
利用C语言替换文件中某一行的方法到这就基本结束了,大家都学会了吗?希望这篇文章的内容对大家的学习和工作能带来一定的帮助,如果有疑问,大家可以留言交流。