天天看點

c語言 在txt檔案中搜尋關鍵詞_C檔案操作 —— 在檔案中查找關鍵字并替換

http://blog.csdn.net/ding285119896/article/details/13161947

C語言标準路為我們提供了檔案操作函數:

包含:fopen()/fclose()          //檔案打開與關閉函數;(參數與傳回類型省略)

fgetc()/fputc()             //從流中擷取字元,向檔案流中寫入字元;

getc()/putc()               //與fgetc()/fputc()等價,不同的是,當getc()/putc()定義為宏時,可能多次計算stream的值;

getchar()/putchar()    //與上述兩種類似;

ungetc()                     //将字元轉化為unsigned char 類型寫回到流中;

fscanf()/fprintf()         //用于檔案的格式化輸入輸出;

fread()/fwrite()           //從流中讀/寫特定數目的特定機關大小的對象;

fgets()/fputs()             //從檔案流中擷取字元串,或将字元串寫入流中;

其中char* fgets(char*s,int size,FILE*fp)最多将size-1個字元讀入s中,s的第size個存儲空間保留‘\0’,因而s中保留的為字元串,對于檔案,如遇到換行符,讀取結束。即:當size大于檔案一行的字元數時,fgets()運作一次讀取檔案中的一行,否則,一次讀取特定數目的字元。(在實際中,當s由動态配置設定獲得時,讀取失敗  ,隻能采取靜态配置設定這是為什麼,求解?)。

檔案定位函數:

int fseek(FILE*stream,long offset,int orign)

對于二進制流,被設定為origin開始的第offset個字元處,origin:SEEK_SET,SEEK_CUR,SEEK_END;

對于文本流,offset必須設定為0,獲是ftell()的傳回值(此時origin必須設定為SEEK_SET;

int ftell(FILE*stream)   //傳回stream流的目前檔案位置;

void rewind()               //即:fseek(fp,0L,SEEK_SET);clearerr(fp);

int fgetpos(FILE*stream,fpos_t *ptr)    //擷取流的目前位置,記錄在*ptr中

int fsetpos(FILE*stream,const fpos_t *ptr)    //将流的目前位置設定為*ptr中的位置

int feof(fp)  檔案是否到檔案結束符,若是,則傳回非0值,否則傳回0。

例子:從檔案name1中查找字元串,并替換為另一個字元串,結果儲存在name2檔案中

1、替換字元串中的特定字元串

1、替換字元串中的特定字元串

[cpp] view plain copy

voidSubstitute(char*pInput,char*pOutput,char*pSrc,char*pDst)

{

char*pi, *po, *p;

intnSrcLen, nDstLen, nLen;

// 指向輸入字元串的遊動指針.

pi = pInput;

// 指向輸出字元串的遊動指針.

po = pOutput;

// 計算被替換串和替換串的長度.

nSrcLen = strlen(pSrc);

nDstLen = strlen(pDst);

// 查找pi指向字元串中第一次出現替換串的位置,并傳回指針(找不到則傳回null).

p = strstr(pi, pSrc);

if(p)

{

// 找到.

while(p)

{

//計算被替換串前邊字元串的長度.

nLen = (int)(p - pi);

// 複制到輸出字元串.

memcpy(po, pi, nLen);

memcpy(po + nLen, pDst, nDstLen);

// 跳過被替換串.

pi = p + nSrcLen;

// 調整指向輸出串的指針位置.

po = po + nLen + nDstLen;

// 繼續查找.

p = strstr(pi, pSrc);

}

// 複制剩餘字元串.

strcpy(po, pi);

}

else

{

// 沒有找到則原樣複制.

strcpy(po, pi);

}

} 測試程式:

[cpp] view plain copy

intmain()

{

FILE*fpSrc,*fpDes;

charfilename1[20]="ding1.txt";

charfilename2[20]="ding2.txt";

//要求查找的字元串,替換的字元串;

charps[]="computer";

charpd[]="basketballs";

//求取所查找和替換的字元串的長度;

intlen_src=strlen(ps);

intlen_des=strlen(pd);

//定義存儲字元串緩沖區;很奇怪的一點是,fgets函數不能将字元串寫入動态配置設定的記憶體中

charSrc_buf[MAXSIZES];

charCpy_buf[MAXSIZES];

charDes_buf[MAXSIZES];

//打開檔案

if((fpSrc=fopen(filename1,"r+"))==NULL)

{

printf("fail to open the file1 !\n");

exit(1);

}

if((fpDes=fopen(filename2,"a+"))==NULL)

{

printf("fail to open the file2 !\n");

exit(1);

}

//進行循環讀取

while(!feof(fpSrc))//判斷檔案是否已結束;!feof(fpSrc)

{

fgets(Src_buf,MAXSIZES,fpSrc);

Substitute(Src_buf,Des_buf,ps,pd);

fputs(Des_buf,fpDes);

printf("%s",Des_buf);

}

fclose(fpSrc);

fclose(fpDes);

system("pause");

return0;

}