【问题标题】:Large ints being misread/miswritten to binary file大整数被误读/误写到二进制文件
【发布时间】:2016-08-23 10:19:07
【问题描述】:

我正在尝试创建一个保存/加载系统。虽然我创建了大量的 ASCII 解析器,但我不太习惯二进制解析器。目前,如果我传递一个小值,比如 2,它就可以工作。也一样。 11. 10 返回 13,412 返回 -100。我正在使用可以在读取之前预先计算大小的缓冲区,但无论如何我得到的值不正确。

这是保护方法的一部分:

FILE *ptr_myfile;

ptr_myfile = fopen("data.sav", "wb");
uint32_t bufferSize = 4;
char *writeBuffer = (char*)malloc(bufferSize);

int value = 412;
memcpy(&writeBuffer, &value, sizeof(value));

fwrite(&writeBuffer, sizeof(char), sizeof(writeBuffer), ptr_myfile);

fclose(ptr_myfile);

这是加载器方法的一部分:

FILE *ptr_myfile;

ptr_myfile = fopen("data.sav", "rb");

//Get file length
fseek(ptr_myfile, 0, SEEK_END);
unsigned long fileLen = ftell(ptr_myfile);
fseek(ptr_myfile, 0, SEEK_SET);

char *buffer = (char *)malloc(fileLen + 1);
if (!buffer) {
    fprintf(stderr, "Memory error!");
    fclose(ptr_myfile);
    return;
}

fread(buffer, fileLen, 1, ptr_myfile);

printf("%i\n", (int)buffer[0]);

fclose(ptr_myfile);

提前致谢!

【问题讨论】:

  • 这看起来更像 C 而不是 C++,甚至不如前者。您是从哪里得知这是如何用 C++ 编写二进制数据的?你需要停止尝试通过反复试验来学习 C++,那 真的 是行不通的。 C 语言也是如此,同样糟糕。
  • (int)buffer[0] 仅将buffer 的第一个元素转换为int。另外,使用memcpy 序列化提供了一个非便携的解决方案
  • @BaummitAugen 我不确定你指的是什么。我使用 FILE * 是因为我曾经读过它更快,但即使不是,它不也一样有能力吗?所有 f* 函数都是 C,我只是打开一个文件,创建一个缓冲区,复制到它,然后使用 fwrite 将它移动到文件中,对 fread 做同样的事情?你能具体说说你的意思吗?
  • 对于初学者:char *writeBuffer = (char*)malloc(bufferSize); 不要在 C++ 中这样做。 fwrite(&writeBuffer, sizeof(char), sizeof(writeBuffer), ptr_myfile); 在 C 和 C++ 中都是错误的。此外,这个memcpy 业务一开始是完全没有必要的。真的,选择 C ​​或 C++ 并从一本好书中系统地学习您选择的任何内容。
  • @Garf365 在这种情况下它仍然有效吗?我只是想让它工作一次,然后我会根据加载的实体类型对其进行返工。计划是用一个字符串表示类类型,然后创建它并基于恢复方法推送所有数据。 (即:9 npc_human 3 bob 24 65,其中 9 是 npc_human 的长度,npc_human 是类“名称”,3 是 bob 的长度是实体的名称,24 是 hp,65 是弹药)。

标签: c++ file binary buffer


【解决方案1】:
char *buffer = (char *)malloc(fileLen + 1);

缓冲区是chars 的数组。

printf("%i\n", (int)buffer[0]);

这会在将buffer[0] 转换为int 后打印单个字符的值。

显然,您编写二进制文件的代码无法将整个 int 填充到文件的第一个字符中。它将memcpyed int 放入字符缓冲区。

要读回这个,过程正好相反:memcpy() 将字符缓冲区转换为 int 变量。

【讨论】:

  • 谢谢!这行得通。 memcpy(&value, 缓冲区, sizeof(int));对于任何对此进行调查的人。我将尝试重写代码,因为显然,这很糟糕 XD 但我仍然非常感谢,Sam!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-26
  • 2018-07-26
  • 2016-06-14
  • 2021-06-03
相关资源
最近更新 更多