使用fread读入int缓冲区

我想知道我是否可以使用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; 

这有什么不对?

谢谢

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

正如其他人所说,如果输入是您期望的二进制格式,那么fread应该能够做您想要的。 我要补充的一个警告是,如果输入文件在具有不同大小的整数或不同的字符串(sp)的平台之间移动,则代码将具有平台依赖性并且将无法正常运行。

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

是的,您可以使用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。

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

  1. 5
  2. 5 5 5

我从http://www.programmersheaven.com/mb/beginnercpp/396198/396198/fread-returns-invalid-integer/获得的详细信息

fread()读取二进制数据(即使文件以’text’模式打开)。 hex的数字5403525650x203520350x20的ASCII代码, 0x35'5'的ASCII代码(因为使用了小端机器,它们的顺序相反)。

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

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

请注意,以下代码不包含正确的检查,如果文件不存在则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);