利用C語(yǔ)言替換文件中某一行的方法
文件中存貯的內(nèi)容如下所示:
11 1122 0 1122 * * 0 0 22 222 0 222 * * 0 0 33 333 0 333 * * 0 0
通過(guò)使用下面的幾個(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ù)寫(xiě)入到文件中的是追加的形式。
具體的寫(xiě)入代碼如下所示:
主要寫(xiě)入時(shí)要指定每個(gè)數(shù)據(jù)的寬度,若不指定,當(dāng)修改某行的數(shù)據(jù),修改后的長(zhǎng)度大于修改前得長(zhǎng)度,將影響文件中的下一行。制定寬度之后,只要修改后的長(zhǎng)度不大于制定的寬度,都不影響下面的內(nèi)容。(這是注意點(diǎn))
FILE *fp=fopen("clientinfo.txt","ar+"); Clientinfo info; memset(&info,0,sizeof(Clientinfo)); 。。。。 。。。。/*完成對(duì)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è)位置是上一次讀的最后,故寫(xiě)的時(shí)候要先寫(xiě)換行,第一行除外*/ 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ù),修改第二行,沒(méi)有影響前后的數(shù)據(jù)。
11 1122 0 1122 * * 0 0 22 222f 0 222f * * 0 0 33 333 0 333 * * 0 0
總結(jié)
利用C語(yǔ)言替換文件中某一行的方法到這就基本結(jié)束了,大家都學(xué)會(huì)了嗎?希望這篇文章的內(nèi)容對(duì)大家的學(xué)習(xí)和工作能帶來(lái)一定的幫助,如果有疑問(wèn),大家可以留言交流。
相關(guān)文章
C++開(kāi)發(fā)之CRC校驗(yàn)實(shí)例詳解
這篇文章主要介紹了C++開(kāi)發(fā)之CRC校驗(yàn)實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-07-07C++模板以及實(shí)現(xiàn)vector實(shí)例詳解
模板是為了實(shí)現(xiàn)泛型編程,所謂泛型編程,就是指編寫(xiě)與類型無(wú)關(guān)的代碼,下面這篇文章主要給大家介紹了關(guān)于C++模板以及實(shí)現(xiàn)vector的相關(guān)資料,需要的朋友可以參考下2021-11-11C語(yǔ)言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程
本文主要介紹了C語(yǔ)言中pthread_exit()函數(shù)實(shí)現(xiàn)終止線程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05深入淺析C/C++語(yǔ)言結(jié)構(gòu)體指針的使用注意事項(xiàng)
這篇文章主要介紹了C/C++語(yǔ)言結(jié)構(gòu)體指針的使用,大家都知道指針在32位系統(tǒng)占用4Byte,在64位系統(tǒng)占用8Byte,下面看下c語(yǔ)言代碼例子2021-12-12C++實(shí)現(xiàn)LeetCode(兩個(gè)有序數(shù)組的中位數(shù))
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(兩個(gè)有序數(shù)組的中位數(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07C++數(shù)據(jù)結(jié)構(gòu)之單鏈表
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之單鏈表,鏈表是由一個(gè)個(gè)結(jié)點(diǎn)鏈結(jié)成的。結(jié)點(diǎn)包括數(shù)據(jù)域和指針域兩部分,數(shù)據(jù)域用來(lái)存儲(chǔ)數(shù)據(jù)元素的信息,指針域用來(lái)存儲(chǔ)下一個(gè)結(jié)點(diǎn)的地址,更詳細(xì)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容2022-01-01