代码之家  ›  专栏  ›  技术社区  ›  i486

fread()参数2和3

  •  1
  • i486  · 技术社区  · 7 年前

    以下两者之间的区别是什么:

    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()读取nmemb数据项,每个数据项大小为字节长”。我认为最终读取的字节数必须是 size * nmemb 但出于某种原因,只有第二种语法(size=1)适用于我。

    2 回复  |  直到 7 年前
        1
  •  7
  •   Yaniv Shaked    7 年前

    区别在于以下两个方面:

    1. 返回值是实际读取的元素数(零到 nmemb ). 如果他们成功了,你的两种说法就不同了。
    2. 在第一种情况下:

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

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

      在第二种情况下:

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

      您允许 fread公司 读取尽可能多的字节,即使小于 sizeof(buf) 在文件中可用。将返回实际读取的元素数(本例中为字节)。

        2
  •  0
  •   Orçun Çolak    7 年前

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

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

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