fwrite 和 fread 动态分配的 char 数组,其中包含数字和符号,只读 4 个字节而不是 9 个字节
fwrite and fread dynamic allocated char array with numbers and symbols in it, read only 4 bytes instead of 9
假设我在结构中有这个 boardValues 数组
typedef struct Stack
{
char* boardValues;
int size;
char* playerSymbol;
int count;
int turnsCount;
}Stack;
我使用这个函数分配内存并初始化值,我把它放在一个循环中,数组从 1 - 9 获取值;
void push( Stack *g, char value )
{
char *temp = realloc( g->boardValues, ( g->size + 1 ) * sizeof( int ) );
if ( temp != NULL )
{
g->boardValues = temp;
g->boardValues[g->size] = value;
++g->size;
}
}
然后随着 tictoe 游戏的进行,boardValues 假设得到这个值 boardValues = ['X','O','O,'X','X','O',6,7,8,9]
我需要以二进制形式保存这些数据,然后从中加载,这是函数:
int saveToBinary(Stack *g) {
if (strcmp("continue",name) != 0){
strncat(name,".bin",5);
FILE *fp;
fp = fopen(name, "wb");
if(fp != NULL){
fwrite(g->boardValues ,1 ,sizeof(g->boardValues) ,fp);
fwrite(g->playerSymbol ,1 ,sizeof(g->playerSymbol) ,fp);
fwrite(&g->count ,1 ,sizeof(&g->count) ,fp);
fwrite(&g->turnsCount ,1 ,sizeof(&g->turnsCount) ,fp);
fclose(fp);
exit(1);
}
else {
return 2;
}
}
else {
return 1;
}
}
int loadFromBinary(Stack *g){
FILE *fp;
fp = fopen(saveName, "rb");
if (fp != NULL){
fread(g->boardValues ,sizeof(g->boardValues) ,1, fp);
fread(g->playerSymbol ,sizeof(g->playerSymbol) ,1 ,fp);
fread(&g->count ,1 ,sizeof(g->count) ,fp);
fread(&g->turnsCount ,1 ,sizeof(g->turnsCount) ,fp);
fclose(fp);
return 1;
}
else {
return 0;
}
}
问题是我只得到前 4 个字符符号,其他 2 个变成垃圾(我认为),然后我从中得到最后一个数字,所以不知何故有些符号消失了。我尝试将 fread 更改为 fread(g->boardValues ,sizeof(char) ,9, fp);但其他值如 turnsCount 或 count 变成垃圾
sizeof(g->boardValues)
和 sizeof(g->playerSymbol)
是指针的大小,而不是分配的缓冲区。
您应该首先 read/write 缓冲区的大小,然后 read/write 缓冲区的内容。注意不要忘记在读取前分配缓冲区。
g->boardValues
的示例:
保存:
fwrite(&g->size ,1 ,sizeof(g->size) ,fp);
fwrite(g->boardValues ,1 ,g->size ,fp);
加载:
fread(&g->size ,1 ,sizeof(g->size) ,fp);
g->boardValues = malloc(g->size);
fread(g->boardValues ,1 ,g->size ,fp);
(错误处理省略)
假设我在结构中有这个 boardValues 数组
typedef struct Stack
{
char* boardValues;
int size;
char* playerSymbol;
int count;
int turnsCount;
}Stack;
我使用这个函数分配内存并初始化值,我把它放在一个循环中,数组从 1 - 9 获取值;
void push( Stack *g, char value )
{
char *temp = realloc( g->boardValues, ( g->size + 1 ) * sizeof( int ) );
if ( temp != NULL )
{
g->boardValues = temp;
g->boardValues[g->size] = value;
++g->size;
}
}
然后随着 tictoe 游戏的进行,boardValues 假设得到这个值 boardValues = ['X','O','O,'X','X','O',6,7,8,9]
我需要以二进制形式保存这些数据,然后从中加载,这是函数:
int saveToBinary(Stack *g) {
if (strcmp("continue",name) != 0){
strncat(name,".bin",5);
FILE *fp;
fp = fopen(name, "wb");
if(fp != NULL){
fwrite(g->boardValues ,1 ,sizeof(g->boardValues) ,fp);
fwrite(g->playerSymbol ,1 ,sizeof(g->playerSymbol) ,fp);
fwrite(&g->count ,1 ,sizeof(&g->count) ,fp);
fwrite(&g->turnsCount ,1 ,sizeof(&g->turnsCount) ,fp);
fclose(fp);
exit(1);
}
else {
return 2;
}
}
else {
return 1;
}
}
int loadFromBinary(Stack *g){
FILE *fp;
fp = fopen(saveName, "rb");
if (fp != NULL){
fread(g->boardValues ,sizeof(g->boardValues) ,1, fp);
fread(g->playerSymbol ,sizeof(g->playerSymbol) ,1 ,fp);
fread(&g->count ,1 ,sizeof(g->count) ,fp);
fread(&g->turnsCount ,1 ,sizeof(g->turnsCount) ,fp);
fclose(fp);
return 1;
}
else {
return 0;
}
}
问题是我只得到前 4 个字符符号,其他 2 个变成垃圾(我认为),然后我从中得到最后一个数字,所以不知何故有些符号消失了。我尝试将 fread 更改为 fread(g->boardValues ,sizeof(char) ,9, fp);但其他值如 turnsCount 或 count 变成垃圾
sizeof(g->boardValues)
和 sizeof(g->playerSymbol)
是指针的大小,而不是分配的缓冲区。
您应该首先 read/write 缓冲区的大小,然后 read/write 缓冲区的内容。注意不要忘记在读取前分配缓冲区。
g->boardValues
的示例:
保存:
fwrite(&g->size ,1 ,sizeof(g->size) ,fp);
fwrite(g->boardValues ,1 ,g->size ,fp);
加载:
fread(&g->size ,1 ,sizeof(g->size) ,fp);
g->boardValues = malloc(g->size);
fread(g->boardValues ,1 ,g->size ,fp);
(错误处理省略)