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

标签 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 的参数时,我得到了我猜想的内存地址。

最佳答案

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);

关于c - 二进制文件读取 - 写入不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28998608/

相关文章:

c - 使用 malloc 和 realloc 从输入文件到数组

c++ - 如何获取存储在 C++ 列表中的类对象?

c++ - C++ 中的语句 new employee *[num] 是什么意思

C 程序错误地读取文件

Git "Cannot merge binary files"持续集成构建错误

c - 程序从文件读取时显示随机列表数据

c++ - c和c++中函数指针转换的区别

c - 将数组字符串传递给函数指针?

c - 根据 C 标准,什么是字符串重叠?

c++ - 比较两个指针时 ">="运算符的奇怪行为