我试图创建一个保存/加载系统。虽然我已经创建了大量的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);
提前致谢!
答案 0 :(得分:2)
char *buffer = (char *)malloc(fileLen + 1);
Buffer是char
s。
printf("%i\n", (int)buffer[0]);
在将buffer[0]
投射到int
之后,会打印int
的单个字符的值。
显然,编写二进制文件的代码无法将整个memcpy
填充到文件的第一个字符中。它int
将memcpy()
编入字符缓冲区。
要回读这个过程,过程正好相反:int
将字符缓冲区转换为perimeter
变量。