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;
}