假設你的數組爲:
T a[N]; //T is the type of each element
//and N is the number of elements in the array
//fill the array here
現在,你想寫使用fwrite
這個數組,所以你通過a
作爲第一個參數爲:
fwrite(a, .....);
現在怎麼會fwrite
知道它需要寫多少字節?它不能從它的第一個參數知道這是因爲a
被轉換成const void*
其中失去很多有用的信息,如類型陣列在每個元件,從而它可能已計算出的各元件的尺寸,但這種信息在你傳遞a
作爲第一個參數的那一刻就失去了。所以,你需要每個元素的大小通過爲:
fwrite(a, sizeof(T), ....);
現在fwrite
知道從那裏將讀取的元素地址(或指針),並且它也知道每個元素的大小。但它仍然不知道有多少元素。所以你通過陣列中的元素數量,如:
fwrite(a, sizeof(T), N, ...);
現在它知道關於數據的一切。現在它需要知道的只是文件指針。所以在這裏你寫它:
FILE *fp = /*.....*/ ;
fwrite(a, sizeof(T), N, fp);
希望有所幫助。
1.當a
轉換成const void*
,它也失去了其元件的數量另一個有用的信息。但在C中,你不能傳遞一個數組作爲參數。當你這樣做時,它會衰減到指針,失去了有關數組大小的信息。 fwrite
是C庫中的一個函數。但是,如果你在C++中使用fwrite
,那麼你就可以把它包裝在一個函數模板:
template<typename T, size_t N>
size_t fwrite(T (&a)[N], FILE *fp)
{
return fwrite(a, sizeof(T), N, fp); //call the C function here
}
然後,你可以簡單地將其稱爲:
int a={1,2,3,4,5,6,7};
double b={10,20,30,40,50,60,70};
fwrite(a,fp);
fwrite(b,fp);
看起來不錯?但是你可以一個指針不能通過這樣的:
float *c = new float[100];
fwrite(c,fp); //compilation error
這是因爲我們的fwrite
函數模板將只接受數組,而不是指針。
您是否閱讀過鏈接到的文檔? ESP。備註部分? – Mat 2012-02-09 15:40:59