2

我对如何fread()使用感到困惑。以下是来自cplusplus.com的示例

/* fread example: read a complete file */
#include <stdio.h>
#include <stdlib.h>

int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;

  pFile = fopen ( "myfile.bin" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);

  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

  /* the whole file is now loaded in the memory buffer. */

  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}

假设我还没有使用fclose()。我现在可以将buffer其视为一个数组并访问类似的元素buffer[i]吗?还是我必须做其他事情?

4

1 回答 1

4

当然可以,当你调用fread数据时,实际上是在缓冲区内复制的。您可以安全地关闭文件并对缓冲区本身做任何您想做的事情。

如果您询问是否可以通过修改缓冲区和原始文件来访问缓冲区,那么答案是否定的,您必须通过以写入模式打开文件并使用fwrite.

如果您有一个二进制文件,其中包含例如 2 个浮点数、1 个整数和 16 个字符的字符串,您可以轻松定义一个结构

struct MyData
{
  float f1;
  float f2;
  int i1;
  char string[16];
};

and read it directly with:

struct MyData buffer;
fread(&buffer, 1, sizeof(struct MyData), file);
.. buffer.f1 ..
于 2012-04-05T23:25:55.203 回答