第二参数&的作用是什么? fwrite()中的第3个参数?为什么我们需要3rcount?

时间:2012-02-09 15:37:48

标签: c++ visual-c++ fwrite

你好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”和&之间的区别第三个参数“计数”?

是否意味着从缓冲区复制到文件的数据大小“大小”。计数在这里扮演什么角色。 ??

3 个答案:

答案 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是您要编写的元素的数量。