2012-02-09 28 views
2

喜的fwrite()的簽名如下:fwrite()中的第二個參數和第三個參數的作用是什麼?爲什麼我們需要3rcount在這裏?

size_t fwrite (const void * ptr, size_t size, size_t count, FILE * stream); 

http://msdn.microsoft.com/en-us/library/h9t88zwz.aspx

我不明白的第二個參數 「大小」 &第三個參數 「計數」 之間的區別?

這是否意味着從緩衝區複製到文件的大小大小爲「大小」。伯爵在這裏扮演什麼角色。 ??

+1

您是否閱讀過鏈接到的文檔? ESP。備註部分? – Mat 2012-02-09 15:40:59

回答

3

你正在寫COUNT的東西,每個東西的尺寸都是SIZE。

所以,如果你有50個FooBar的結構數組,你會怎麼做:

fwrite(some_pointer, sizeof(FooBar), 50, some_stream); 

所以你始終設置大小爲1,而是寫:

fwrite(some_pointer, 1, 50 * sizeof(FooBar), some_stream); 

,但我相信第一種方式是,如果沒有別的,更容易閱讀並且不容易出錯。

+0

當第一種方式對I/O緩衝區更友好時,我被教導回去。不知道這是否成立。 – 2012-02-09 16:00:17

1

大小是你想寫的每個元素的大小。如果是字節,則應使用1,否則使用sizeof(whatever)

Count是您想要寫入的元素的數量。

3

假設你的數組爲:

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函數模板將只接受數組,而不是指針。

相關問題