第二个参数和第三个参数在fwrite()中的作用是什么?为什么我们在这里需要 3rcount?

What is role of 2nd parameter & 3rd parameter in fwrite()? Why we need 3rcount here?

本文关键字:参数 我们 为什么 是什么 3rcount 作用 在这里 fwrite 三个 第二个      更新时间:2023-10-16

Hi fwrite(( 的签名如下:

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

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

我不明白第二个参数"大小"和第三个参数"计数"之间的区别?

这是否意味着从缓冲区复制到文件的数据的大小是大小"大小"。计数在这里必须发挥什么作用。??

你正在编写 COUNT 的东西,每个东西的大小都是 SIZE。

因此,如果你有一个包含 50 个 FooBar 结构的数组,你会做:

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

因此,您始终可以将大小设置为 1,然后改为编写:

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

但我相信第一种方法,如果不出意外,更容易阅读并且更不容易出错。

假设你有一个数组:

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*会丢失很多有用的信息,例如数组1中每个元素的类型,因此它可以计算每个元素的大小,但是当你传递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函数模板将只接受数组,而不接受指针。

大小是要编写的每个元素的大小。如果是字节,则应使用 1 ,否则使用 sizeof(whatever)

计数是要写入的元素的数量。

相关文章: