这是我的问题:我不知道如何从二进制文件中读取整数。我需要一个解决方案来理解代码背后的问题。
此格式可存储小尾数形式的32位整数。例如,我们有一个文件,其中包含3个值:1、2和3,采用这种格式,它们将被编码为: 01 00 00 00 02 00 00 00 03 03 00 00 00或01 FF FF FF ...。
我写了一些代码,但我不明白为什么它不起作用。调试不会给我错误。
这是我的代码
#include <stdlib.h>
#include <stdio.h>
int *leggiinteri2(const char *filename, size_t *size)
{
FILE *f;
int *p = NULL;
f = fopen(filename, "rb");
if (f == NULL) {
p = NULL;
}
else {
size_t nInteri = fread(size, sizeof(int), 1, f);
if (nInteri != 1) {
if (feof(f)) {
p = NULL;
}
if (ferror(f)) {
p = NULL;
}
}
else {
p = malloc(sizeof(int)*((int)size));
fseek(f, 0, SEEK_SET);
nInteri = fread(p, sizeof(int), *size, f);
if (nInteri != *size) {
if (feof(f)) {
p = NULL;
}
if (ferror(f)) {
p = NULL;
}
}
}
}
fclose(f);
return p;
}
答案 0 :(得分:0)
尝试类似的事情:
fread (buffer, sizeof(char), 8, fid);
x = (s32)(((buffer[0]<<24) & 0xFF000000) + ((buffer[1]<<16) & 0x00FF0000)
+ ((buffer[2]<< 8) & 0x0000FF00) + ( buffer[3] & 0x000000FF));
我不确定顺序(小字节序或大字节序)。如果为KO,则反转缓冲区索引3、2、1、0。
答案 1 :(得分:0)
我终于找到了解决方案,虽然花了很多时间,但还是值得的,现在我了解了其背后的逻辑。
这是需要的人的代码:
#include <stdlib.h>
#include <stdio.h>
int *leggiinteri2(const char *filename, size_t *size)
{
FILE *f;
int *p = NULL;
f = fopen(filename, "rb");
if (f == NULL) {
p = NULL;
}
else {
fseek(f, 0, SEEK_END); //It tells me how many values there are in
//the file, both those that I need and those
//that do not
long dim = ftell(f); // I assign to dim the value that tells me
//ftell, conditioned by the previous function
dim = dim / 4; //because I want the integer values (int = 4 bytes)
*size = dim;
p = malloc(sizeof(int) * dim);
fseek(f, 0, 0);
size_t n = fread(p, sizeof(int), *size, f);
if (n != *size) {
if (feof(f)) {
p = NULL;
}
if (ferror(f)) {
p = NULL;
}
}
if (n == 0) //serves to check for empty or NULL files
p = NULL;
}
fclose(f);
return p;
}