你好fwrite()的签名如下:
size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );
http://msdn.microsoft.com/en-us/library/h9t88zwz.aspx
我不明白第二个参数“size”和&之间的区别第三个参数“计数”?
是否意味着从缓冲区复制到文件的数据大小“大小”。计数在这里扮演什么角色。 ??
答案 0 :(得分:3)
你正在写COUNT个东西,每个东西的大小都是SIZE。
因此,如果你有一个包含50个FooBar结构的数组,你可以这样做:
fwrite( some_pointer, sizeof(FooBar), 50, some_stream );
所以你可以总是将大小设置为1,而是写:
fwrite( some_pointer, 1, 50 * sizeof(FooBar), some_stream);
但我相信第一种方式是,如果没有别的,更容易阅读,更不容易出错。
答案 1 :(得分: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*
会丢失大量有用的信息,例如 type 数组中的每个元素 1 < / sup>,因此它可以计算每个元素的大小,但是当您将a
作为第一个参数传递时,此信息将丢失。所以你需要将每个元素的大小传递为:
fwrite(a, sizeof(T), ....);
现在fwrite
知道它将读取元素的地址(或指针),并且它还知道每个元素的 size 。但它仍然不知道有多少元素。因此,您传递数组中的元素数量:
fwrite(a, sizeof(T), N, ...);
现在它知道有关数据的一切。现在它需要知道的是文件指针。所以在这里你把它写成:
FILE *fp = /*.....*/ ;
fwrite(a, sizeof(T), N, fp);
希望有所帮助。
1。当a
转换为const void*
时,它还会丢失另一个有用的信息,即 number 元素。但在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
函数模板只接受数组,而不是指针。
答案 2 :(得分:1)
大小是您要编写的每个元素的大小。如果是字节,则应使用1
,否则请使用sizeof(whatever)
。
Count是您要编写的元素的数量。