第二个参数和第三个参数在fwrite()中的作用是什么?为什么我们在这里需要 3rcount?
What is role of 2nd parameter & 3rd parameter in fwrite()? Why we need 3rcount here?
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)
。
计数是要写入的元素的数量。
- 为什么我们不能重复使用具有不同模板参数的别名模板标识符?
- 我们可以用参数化构造函数初始化结构的数组吗?
- 对象作为参数传递,就好像我们正在传递构造函数值一样
- 我们能否使 GDB 在回溯中显示非平凡的参数
- 为什么我们需要在优先级队列声明中添加一个向量作为参数?
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- 我们如何在线程中使用参数
- 为什么我们不允许将纯引用参数传递给 std::thread,但允许传递原始指针?
- 我们如何在 c++ 中检查模板参数的类型?
- 为什么我们可以创建一个模板类结构,其中包含许多与声明结构时指定的参数不同的参数
- 我们可以使用指针和何时使用空参数
- 类介绍 (c++) 项目希望我们创建两个构造函数,但它们都不需要任何参数 - 我应该在这里做什么?
- 可变参数函数并复制粘贴这些参数(就像我们在宏中一样)
- 当我们在 C++ 中的参数中传递它们时,如何修改一些数组而不修改其他数组
- 为什么我们不能在模板专业化的开始/中间使用可变参数模板(以及如何模拟)?
- 当我们声明额外的模板参数而未在定义中使用时,为什么编译器会丢弃错误
- 在哪些条件下,我们将指针作为函数参数
- 在 C++ 中,为什么我们在重载函数中将引用参数声明为 const
- 让我们C++推断定义参数的类/命名空间的位置
- C - 我应该接受哪种类型的参数?(我们什么时候应该铸造?)