fread() 参数 2 和 3

fread() parameters 2 and 3

有什么区别:

fread( buf, sizeof buf, 1, file ); // 'file' is valid open 'FILE *'

fread( buf, 1, sizeof buf, file );

参数 2 和 3 size_t size, size_t nmemb 描述为 "fread() reads nmemb items of data, each size bytes long"。我认为最终读取的字节数必须是 size * nmemb 但出于某种原因只有第二种语法(大小 = 1)对我有用。

区别在于以下两个:

  1. return 值是实际读取的元素数(零到 nmemb)。这在你的两个声明中是不同的,如果他们成功的话。
  2. 第一种情况:

    fread( buf, sizeof(buf), 1, file )
    

    你要么得到全部,要么一无所有;如果文件较小,fread 无法读取小于 sizeof(buf) 的内容。

    第二种情况:

    fread( buf, 1, sizeof(buf), file );
    

    您允许 fread 读取尽可能多的字节,即使文件中可用的字节少于 sizeof(buf)。实际读取的元素数量(本例中为字节)将被 returned.

第二个参数指定要读取的元素的大小。第三个参数指定要读取多少个元素。

所以在第一种情况下你想读取大小为 1 的元素 = sizeof(buf).

在第二种情况下,您想要读取 sizeof(buf) 个元素,其中每个元素为 1 字节。第二个可以用来读取整个文件的内容,如这个 How to set/get unsigned char * to and from std::shared_ptr<uint8_t>? 问题。