C fwrite和fread动态分配的字符数组,其中包含数字和符号,只读4字节,而不是9字节
假设我在结构中有这个boardValues数组C fwrite和fread动态分配的字符数组,其中包含数字和符号,只读4字节,而不是9字节,c,data-structures,fwrite,fread,C,Data Structures,Fwrite,Fread,假设我在结构中有这个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 = reallo
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','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)
是指针的大小,而不是分配的缓冲区
您应该首先读取/写入缓冲区的大小,然后读取/写入缓冲区的内容。小心不要忘记在读取前分配缓冲区
g->boardValues
示例:
保存:
负载:
(省略错误处理)Hmm.
sizeof(g->boardValues)
只返回指针的大小,而不返回指向项目的大小。另外,为什么realloc()
赋值给boardValues
考虑sizeof(int)
当它是char*
时?我对c语言还是新手,但是关于realloc(),虽然如果我把sizeof(char)赋值给char数组,因为int是4字节,char是1,所以我分配了更多的内存。这不是一种正确的方法吗?我刚刚尝试过,它似乎可以与sizeof(char)一起使用,但为什么?如果您只需要为这么多字符留出空间,但却要求为这么多int
留出空间,那么您需要的内存是实际需要的4(或8)倍。它会起作用,但很浪费。
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);