使用fread读入int缓冲区

时间:2011-10-03 07:21:38

标签: c++ c buffer fread

我想知道我是否可以使用fread将数据读入整数缓冲区。 我看到fread()将void *作为第一个参数。所以我不能只传递一个整数 缓冲区(类型转换为void *)然后使用它来读取我想要的文件中的howmuchevery字节,只要缓冲区足够大?

即。我无法做到:

  int buffer[10];
  fread((void *)buffer, sizeof(int), 10, somefile);
  // print contents of buffer
  for(int i = 0; i < 10; i++)
  cout << buffer[i] << endl;

这里有什么问题?

由于

5 个答案:

答案 0 :(得分:7)

如果您使用类似fwrite(“二进制”写入)的内容将文件写入文件,这应该可行。如果文件是人类可读的(您可以使用文本编辑器打开它并查看有意义的数字),您可能需要fscanf / cin

答案 1 :(得分:4)

正如其他人所说,fread应该能够做你想做的事 如果输入是您期望的二进制格式。一个警告 我想补充的是代码将具有平台依赖性和 如果在两者之间移动输入文件,它将无法正常工作 具有不同大小或不同大小的平台 endian-nesses(sp)。

此外,您应该始终检查您的返回值;恐惧可能会失败。

答案 2 :(得分:2)

是的,您可以使用fread读取整数数组

int buffer[10]; 

size_t readElements = fread((void *)buffer, sizeof(int), 10, somefile); 

for(int i = 0; i < readElements; i++) 
   cout << buffer[i] << endl

你可以检查fread返回要打印的元素数量。

编辑:如果您正在以二进制模式读取文件,并且这些值被写为带有fwrite的cnicutar。

答案 3 :(得分:2)

我正在尝试相同的结果并获得与您相同的结果,当尝试使用文件中的fread()读取整数时获得大的int值,并最终得到了它的原因。 因此,假设您的输入文件仅包含:

  1. 5
  2. 5 5 5
  3. 我从http://www.programmersheaven.com/mb/beginnercpp/396198/396198/fread-returns-invalid-integer/

    获得的详细信息

    fread()读取二进制数据(即使文件以'text'模式打开)。十六进制中的5403525650x203520350x20为空格的ASCII代码,0x35'5'的ASCII代码(它们位于因为使用小端机器而反转顺序。

    所以fread所做的是从文件中读取ASCII代码并从中构建一个int,期望二进制数据。这应该解释在阅读'5 5 5'文件时的行为。使用单个'5'读取文件时会发生同样的情况,但只能读取一个字节(如果后面跟一个换行符,则只读取两个),如果读取小于{{1,则fread会失败}},这是sizeof(int)(在这种情况下)。

答案 4 :(得分:1)

由于对响应的反应是它仍然不起作用,我将在这里提供完整的代码,以便您可以尝试。

请注意,以下代码不包含正确的检查,如果文件不存在则CAN崩溃,则没有内存,没有权限等。 在代码中应该添加检查每个打开,关闭,读取,写入操作。

此外,我会动态分配缓冲区。

int* buffer = new int[10];

那是因为当普通数组被当作指针时我感觉不舒服。但是无所谓。还请注意,根据数字范围,应使用正确的类型(uint32_t,16,8,int,short ...)来节省空间。

以下代码将创建文件并写入正确的数据,然后您可以阅读。

    FILE* somefile;
    somefile = fopen("/root/Desktop/CAH/scripts/cryptor C++/OUT/TOCRYPT/wee", "wb");

  int buffer[10];
  for(int i = 0; i < 10; i++)
    buffer[i] = 15;

  fwrite((void *)buffer, sizeof(int), 10, somefile);
  // print contents of buffer
  for(int i = 0; i < 10; i++)
  cout << buffer[i] << endl;

  fclose(somefile);

    somefile = fopen("/root/Desktop/CAH/scripts/cryptor C++/OUT/TOCRYPT/wee", "rb");

  fread((void *)buffer, sizeof(int), 10, somefile);
  // print contents of buffer
  for(int i = 0; i < 10; i++)
  cout << buffer[i] << endl;

  fclose(somefile);