利用C語言替換文件中某一行的方法
文件中存貯的內(nèi)容如下所示:
11 1122 0 1122 * * 0 0 22 222 0 222 * * 0 0 33 333 0 333 * * 0 0
通過使用下面的幾個(gè)函數(shù),fopen,fprintf,fscanf,fseek,ftell 。
具體的函數(shù)函數(shù)原型如下所示:
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)
首先,數(shù)據(jù)寫入到文件中的是追加的形式。
具體的寫入代碼如下所示:
主要寫入時(shí)要指定每個(gè)數(shù)據(jù)的寬度,若不指定,當(dāng)修改某行的數(shù)據(jù),修改后的長度大于修改前得長度,將影響文件中的下一行。制定寬度之后,只要修改后的長度不大于制定的寬度,都不影響下面的內(nèi)容。(這是注意點(diǎn))
FILE *fp=fopen("clientinfo.txt","ar+");
Clientinfo info;
memset(&info,0,sizeof(Clientinfo));
。。。。
。。。。/*完成對info結(jié)構(gòu)體的賦值*/
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);
修改處的代碼如下所示,整個(gè)代碼是我在MFC中實(shí)現(xiàn)的:
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);/*定位到要修改的位置,注意,這個(gè)位置是上一次讀的最后,故寫的時(shí)候要先寫換行,第一行除外*/
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);
下面是修改后的數(shù)據(jù),修改第二行,沒有影響前后的數(shù)據(jù)。
11 1122 0 1122 * * 0 0
22 222f 0 222f * * 0 0
33 333 0 333 * * 0 0
總結(jié)
利用C語言替換文件中某一行的方法到這就基本結(jié)束了,大家都學(xué)會了嗎?希望這篇文章的內(nèi)容對大家的學(xué)習(xí)和工作能帶來一定的幫助,如果有疑問,大家可以留言交流。
相關(guān)文章
C語言詳細(xì)分析講解多文件的程序設(shè)計(jì)
所謂的C語言多文件編程就是,將代碼實(shí)現(xiàn)模塊化。比如說一個(gè)項(xiàng)目的一項(xiàng)功能放在一個(gè)一個(gè)文件里,然后將實(shí)現(xiàn)這個(gè)功能的函數(shù)放在一個(gè)c文件<BR>2022-04-04
實(shí)例講解C語言編程中的結(jié)構(gòu)體對齊
這篇文章主要介紹了C語言編程中的結(jié)構(gòu)體對齊,值得注意的是一些結(jié)構(gòu)體對齊的例子在不同編譯器下結(jié)果可能會不同,需要的朋友可以參考下2016-04-04
C++連接mysql數(shù)據(jù)庫(改進(jìn)版)
C++是大家都非常熟悉的,也是大家平時(shí)辦公中經(jīng)常會用到的,下面這篇文章主要給大家介紹了關(guān)于C++連接mysql數(shù)據(jù)庫的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
構(gòu)造函數(shù)不能聲明為虛函數(shù)的原因及分析
構(gòu)造函數(shù)不需要是虛函數(shù),也不允許是虛函數(shù),因?yàn)閯?chuàng)建一個(gè)對象時(shí)我們總是要明確指定對象的類型,盡管我們可能通過實(shí)驗(yàn)室的基類的指針或引用去訪問它但析構(gòu)卻不一定,我們往往通過基類的指針來銷毀對象2013-10-10
C++中設(shè)計(jì)一個(gè)類時(shí)的注意事項(xiàng)分享
這篇文章主要來和大家分享一下C++中,設(shè)計(jì)一個(gè)類要注意哪些東西,這往往也是C++面試時(shí)會考到的問題,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-06-06
C++標(biāo)準(zhǔn)庫中sstream與strstream的區(qū)別詳細(xì)解析
以下是對C++標(biāo)準(zhǔn)庫中sstream與strstream的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過來參考下2013-09-09

