【发布时间】: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 是弹药)。