本片主要是對fread fwite 的檔案指標定位問題進行總結
fread
功 能: 從一個流中讀資料
函數原型: size_t fread(void*buffer,size_tsize,size_tcount,FILE*stream);
參 數:
1.用於接收資料的地址(指標)(buffer)
2.單個元素的大小(size) :單位是位元組而不是位,例如讀取一個int型資料就是4個位元組
3.元素個數(count)
4.提供資料的檔案指標(stream)
傳回值:讀取的元素的個數
example:
void main()
{
FILE *fp;
char buf[10];
if((fp=fopen("test.ini","r+"))==NULL)
{
printf("open error\n");
}
fread(buf,2,1,fp);
printf("%s\n",buf);
fread(buf,2,1,fp);
printf("%s\n",buf);
fclose(fp);
}
列印的結果說明,使用了fread以後這次讀到哪裡下次還是從上次的地方開始讀。
但是當我使用了w+方式開啟以後發現裡面的東西全沒了,可見使用w+回清除原來的資料。
下面看看fwrite方式 會不會改變:
void main()
{
FILE *fp;
char buf[3]="abc";
if((fp=fopen("test.ini","w+"))==NULL)
{
printf("open error\n");
}
fwrite(buf,3,1,fp);
//printf("%s\n",buf);
fwrite(buf,3,1,fp);
//printf("%s\n",buf);
fclose(fp);
}
運行程式可見fwrite和fread一樣都是根據上次的重點來進行讀和寫。
下面寫一點fseek,是從百度百科裡看的:
重定位流(資料流/檔案)上的檔案內部位置指標
注意:不是定位檔案指標,檔案指標指向檔案/流。位置指標指向檔案內部的位元組位置,隨著檔案的讀取會移動,檔案指標如果不重新賦值將不會改變指向別的檔案。
int fseek(FILE *stream, long offset, int fromwhere);
函數設定檔案指標stream的位置。如果執行成功,stream將指向以fromwhere(位移起始位置:檔案頭0,當前位置1,檔案尾2)為基準,位移offset(指標位移量)個位元組的位置。如果執行失敗(比如offset超過檔案自身大小),則不改變stream指向的位置。
fseek函數和lseek函數類似,但lseek返回的是一個off_t數值,而fseek返回的是一個整形。
成功,返回0,失敗返回-1,並設定errno的值,可以用perror()函數輸出錯誤。