C++ 大整数被误读/误写到二进制文件
我正在尝试创建一个保存/加载系统。虽然我已经创建了大量ASCII解析器,但我不太习惯二进制解析器。目前,如果我传递一个小值,比如2,它就可以工作。我也是。1110返回13,412返回-100。我使用的缓冲区可以在读取之前预先计算的大小,但是我得到的值不正确 这是saver方法的一部分:C++ 大整数被误读/误写到二进制文件,c++,file,binary,buffer,C++,File,Binary,Buffer,我正在尝试创建一个保存/加载系统。虽然我已经创建了大量ASCII解析器,但我不太习惯二进制解析器。目前,如果我传递一个小值,比如2,它就可以工作。我也是。1110返回13,412返回-100。我使用的缓冲区可以在读取之前预先计算的大小,但是我得到的值不正确 这是saver方法的一部分: FILE *ptr_myfile; ptr_myfile = fopen("data.sav", "wb"); uint32_t bufferSize = 4; char *writeBuffer = (cha
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);
这是加载程序方法的一部分:
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);
提前谢谢
char *buffer = (char *)malloc(fileLen + 1);
缓冲区是一个字符数组
printf("%i\n", (int)buffer[0]);
将buffer[0]
转换为int
后,将打印单个字符的值
显然,编写二进制文件的代码没有将整个int
填充到文件的第一个字符中。它memcpy
将int
插入字符缓冲区
要读回此内容,过程正好相反:memcpy()
将字符缓冲区读入int
变量
缓冲区是一个字符数组
printf("%i\n", (int)buffer[0]);
将buffer[0]
转换为int
后,将打印单个字符的值
显然,编写二进制文件的代码没有将整个int
填充到文件的第一个字符中。它memcpy
将int
插入字符缓冲区
读取此回,过程正好相反:<代码> MycPyIE()/Cuff>字符缓冲区进入<代码> int 变量.< /P>这看起来更像C而不是C++,甚至不如前者好。你从哪里得到的想法是如何在C++中编写二进制数据?你需要停止尝试通过反复学习C++,这真的不行。C也是如此,这同样糟糕。
(int)buffer[0]
只将buffer的第一个元素强制转换为int
。另外,使用memcpy
序列化提供不可移植的solution@BaummitAugen我不知道你指的是什么。我使用FILE*是因为我读过它的速度更快,但即使它不是,它不是也同样有能力吗?所有的f*函数都是C,我只是打开一个文件,创建一个缓冲区,复制到它,然后使用fwrite将它移动到文件中,对fread做同样的操作?你能具体说明一下你的意思吗?对于初学者:char*writeBuffer=(char*)malloc(bufferSize)代码>不要在C++中这样做。代码>写入(&writeBuffer,sizeof(char),sizeof(writeBuffer),ptr_myfile)代码> C和C++中都是错误的。此外,这项memcpy
业务一开始就完全没有必要。真的,选择C或C++,从一本好书中系统地学习你所选择的任何东西。我只想让它工作一次,然后根据加载的实体类型对它进行返工。计划是让一个字符串表示类类型,然后创建它并基于还原方法推送所有数据。(9:NPCHE人3 Bob 24 65,其中9是NPCH1人的长度,NPCHEN是类“名称”,3是Bob的长度,是实体的名称,24是HP,65是弹药)。这看起来更像C,而不是C++,甚至不如前者。你从哪里得到的想法是如何在C++中编写二进制数据?你需要停止尝试通过反复学习C++,这真的不行。C也是如此,这同样糟糕。(int)buffer[0]
只将buffer的第一个元素强制转换为int
。另外,使用memcpy
序列化提供不可移植的solution@BaummitAugen我不知道你指的是什么。我使用文件,因为我曾经读过它更快,但即使它不是,它是否也同样胜任?所有的f*函数都是C,我只是打开一个文件,创建一个缓冲区,复制到它,然后使用fwrite将它移动到文件中,对fread做同样的操作?你能具体说明一下你的意思吗?对于初学者:char*writeBuffer=(char*)malloc(bufferSize)代码>不要在C++中这样做。代码>写入(&writeBuffer,sizeof(char),sizeof(writeBuffer),ptr_myfile)代码> C和C++中都是错误的。此外,这项memcpy
业务一开始就完全没有必要。真的,选择C或C++,从一本好书中系统地学习你所选择的任何东西。我只想让它工作一次,然后根据加载的实体类型对它进行返工。计划是让一个字符串表示类类型,然后创建它并基于还原方法推送所有数据。(即:9 npc_human 3 bob 24 65,其中9是npc_human的长度,npc_human是类“名称”,3是bob的长度是实体名称,24是hp,65是弹药)。谢谢!这起作用了。memcpy(&value,buffer,sizeof(int));任何一个调查此事的人。我将尝试重写代码,因为显然,不管怎样XD都很糟糕,但我仍然非常感激它,山姆!谢谢这起作用了。memcpy(&value,buffer,sizeof(int));任何一个调查此事的人。我将尝试重写代码,因为显然,不管怎样XD都很糟糕,但我仍然非常感激它,山姆!