如何使用fread按值读取文件值?

时间:2016-12-26 23:01:38

标签: c++ file fread bin

我使用fwrite来存储一些数据,现在我正在尝试使用fread从txt文件中读取数据进行处理。我想单独阅读这些值,但我无法弄清楚你是怎么做到的。这就是我的尝试:

#include <stdio.h>
#include <stdlib.h>

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

  pFile = fopen ( "myfile.txt" , "rb" );

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

  // allocate memory to contain the whole file:
  buffer = (unsigned short *) malloc (sizeof(unsigned short)*lSize);

  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);

  printf("%uz\n", result);

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

上面的程序编译得很好但是当我用./a.out运行时,我得到了一个Segmentation错误。当我用sudo ./a.out运行它时,我没有得到seg错误但没有打印出来。 知道我能做些什么来修复它吗?

1 个答案:

答案 0 :(得分:1)

我看到的问题:

分配比所需更多的内存

lSize = ftell (pFile);

lSize设置为文件中的字符数,而不是unsigned short的数量。因此,你需要

buffer = malloc(lSize);

Do I cast the result of malloc?。如果您使用的是C ++编译器(因为C++标记似乎暗示),则需要转换malloc的返回值。

格式说明符错误

printf("%s\n", result);

使用错误的格式说明符打印result。你需要使用

printf("%zu\n", result);

这条线是您看到的分段错误的最可能的罪魁祸首。

逐个阅读对象

你当然可以使用:

size_t count = lSize/sizeof(short);
for ( size_t i = 0; i < count; ++i )
{
   unsigned short number;
   result = fread (&number, sizeof(unsigned short), 1, pFile);        
}

您也可以使用:

size_t count = lSize/sizeof(short);
for ( size_t i = 0; i < count; ++i )
{
   result = fread (buffer+i, sizeof(unsigned short), 1, pFile);        
}