Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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 fwrite和fread动态分配的字符数组,其中包含数字和符号,只读4字节,而不是9字节_C_Data Structures_Fwrite_Fread - Fatal编程技术网

C fwrite和fread动态分配的字符数组,其中包含数字和符号,只读4字节,而不是9字节

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

假设我在结构中有这个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','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);