二进制文件读写 - 写不起作用

时间:2015-03-11 22:29:35

标签: c pointers binaryfiles fwrite fread

我一直在尝试在程序中编写包含一些信息的二进制文件,但我无法使其工作。我写它并尝试阅读它,看看它是否有效。这是我试图在文件中写的结构:

typedef struct{
    int puntuacio;
    int posicio_x;
    int posicio_y;
    int vides;
    int direccio;
}Jugador;

我有一个名为player的变量Jugador。在我使用二进制文件的函数中,我收到player作为指针(所以Jugador *player)。这是我写的代码(我只提供相关部分):

f=fopen("whatever.bin","wb+");
fwrite(nom,sizeof(char),strlen(nom),f); //nom is a string containing the player's name
fwrite(&player,sizeof(Jugador*),1,f);
auxint=player->direccio; //just doing this to see if I pass the info correctly
fwrite(&auxint,sizeof(int),1,f);

//auxp, auxjug and auxint are auxiliar variables I declared inside the function
fseek(f,0,SEEK_SET); //go to the start of the file before reading
fread(auxp,sizeof(char),20,f);
fread(&auxjug,sizeof(Jugador),1,f);
fread(&auxint,sizeof(int),1,f);

printf("auxp:%s--\n",auxp);
printf("puntuacio:%d--\n",auxjug.puntuacio);
printf("dir:%d--\n",auxjug.direccio);
printf("posx:%d--\n",auxjug.posicio_x);
printf("posy:%d--\n",auxjug.posicio_y);
printf("vids:%d--\n",auxjug.vides);
printf("auxint:%d--",auxint);

auxp正确打印名称,但我在字符串的最后一个位置得到一个额外的垃圾字符,但这很容易解决。 auxint打印完美。但是当我打印auxjug的参数时,我得到了我猜的记忆地址。

1 个答案:

答案 0 :(得分:4)

fwrite(&player,sizeof(Jugador*),1,f);

只是将指针大小元素(4或8个字节)写入文件。你需要:

fwrite(player,sizeof(Jugador),1,f);

没有额外的&和额外的*

另一个问题是您只向文件输出strlen(nom)个字节。但是当你读取文件时,你只读了20个字节。所以你应该将你的nom字符串填充到20个字节,并将恰好20个字节写入文件:

fwrite(nom,sizeof(char),20,f);
...
fread(auxp,sizeof(char),20,f);