Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 大整数被误读/误写到二进制文件_C++_File_Binary_Buffer - Fatal编程技术网

C++ 大整数被误读/误写到二进制文件

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

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

这是saver方法的一部分:

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都很糟糕,但我仍然非常感激它,山姆!