fread()后访问内存缓冲区

时间:2012-04-05 23:23:43

标签: c buffer fread

我对如何使用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]之类的元素吗?或者我还需要做其他事情吗?

1 个答案:

答案 0 :(得分:3)

当然,当你调用fread时,你可以将数据实际复制到缓冲区内。您可以安全地关闭文件,并使用缓冲区本身执行任何操作。

如果您询问是否可以通过修改缓冲区和原始文件来访问缓冲区,则答案为否,您必须通过在写入模式下打开文件并使用fwrite来重新写入文件。

如果你有一个二进制文件,例如2个浮点数,1个int和16个字符的字符串,你可以很容易地定义一个结构

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

直接阅读:

struct MyData buffer;
fread(&buffer, 1, sizeof(struct MyData), file);
.. buffer.f1 ..