元素大小和计数在 fread 调用中可以交换吗?

rap*_*102 3 c file function fread

假设我有一个大小为 5000 字节的文件,我正在尝试读取该文件。

我有这个代码:

int main()
{
  char *file_path[] = "/path/to/my/file"
  FILE *fp= fopen(file_path,"rb"); //open the file
  fseek(fp, 0, SEEK_END); // seek to end of file
  unsigned long fullsize = ftell(fp); //get the file size (5000 for this example)
  fseek(fp, 0, SEEK_SET); //bring back the stream to the begging  
  char *buf = (char*)malloc(5000);
  fread(buf,5000,1,fp);
  free(buf);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

我也可以将fread呼叫替换为

fread(buf,1000,5,fp);
Run Code Online (Sandbox Code Playgroud)

什么是更好的?为什么?在优化方面,我理解返回值是不同的。

M.M*_*M.M 6

如果交换这两个参数,您仍然请求读取相同数量的字节。然而,行为在其他方面有所不同:

  • 如果文件短于该数量会发生什么
  • 返回值

由于您应该始终检查 的返回值fread,因此这一点很重要:)

如果您使用 形式result = fread(buf, 1, 5000, fp);,即读取5000大小单位1,但文件大小仅为3000,那么会发生的情况是这些3000字节被放置在您的缓冲区中,并被3000返回。

换句话说,您可以检测到部分读取并仍然使用部分结果。

但是,如果您使用result = fread(buf, 5000, 1, fp);,即读取1大小单位5000,则缓冲区的内容是不确定的(即与未初始化变量的状态相同),并且返回值为0

fseek在这两种情况下,部分读取都会使文件指针处于不确定状态,即在进行任何进一步的读取之前您需要这样做。

使用后一种形式(即除 之外的任何大小1)可能最适合当您想要在完整大小不可用时中止,或者您正在读取具有固定大小记录的文件时。