即使在 C++ 中的 fstream.clear() 之后,对象也没有被保存

object is not being saved even after fstream.clear() in c++

我正在使用 C++ 为我的学校项目编写一个音乐记忆游戏,即使我尝试 PLAYER_DATA.DAT 文件中 对象也没有保存 清除()函数

这里是代码的和平(因为整个代码是 600 多行)

    Player p_dat,plyr;
    plyr.getData();
    fstream P_file("PLAYER_DATA.DAT",ios::out|ios::in|ios::binary);
    while(P_file.read((char*)&p_dat, sizeof(p_dat)))
    {
        if(nameEqual(plyr,p_dat))
        {
            P_file.clear();
            gotoxy(1,10);
            delline();
            textcolor(RED);
            cout<<"\t\t      EXIXTING PLAYER PROFILE FOUND!\n";
            int ch = playPanel("It's me", "Change Name");
            if(ch == 0)
            {
                P_file.seekp(P_file.tellg() - sizeof(Player));
                GameStarted = 1;
                if(c == 1)
                    Campaign(p_dat,P_file);
                else
                    Endless(p_dat,P_file);
                return;
            }
            else
            {
                startGame(c);
                return;
            }
        }
    }
    P_file.clear();
    P_file.seekp(0,ios::end);
    P_file.write((char*)&plyr,sizeof(plyr)); 

简而言之,代码的最后一行没有做任何已经存在且大小为 0kb 的文件 然而,

fstream P_file("PLAYER_DATA.DAT",ios::out|ios::in|ios::binary)
P_file.write((char*)&plyr,sizeof(plyr)); 

正在保存文件。请帮助我。

编辑 1.1

终于发现这一行有问题

P_file.seekp(0,ios::end);

它适用于代码,即正确保存对象

 P_file.clear();
 P_file.write((char*)&plyr,sizeof(plyr));
 P_file.seekp(0,ios::end);

删除时

 P_file.seekp(0,ios::end);

使代码看起来像,

P_file.clear();
 P_file.write((char*)&plyr,sizeof(plyr));

while 循环后,不保存文件

再次不保存对象 这条线有问题,有没有替代品或解决方案?

编译所有警告和调试信息(g++ -Wall -Wextra -gGCC) then use the debugger (e.g. gdb)。

仔细阅读 documentation of C++ IO 个函数。

检查您的文件是否已正确打开;之后:

fstream P_file("PLAYER_DATA.DAT",ios::out|ios::in|ios::binary);

添加

if (!P_file) { std::cerr << "failed to open PLAYER_DATA.DAT" << std::endl; };

在某些系统上(例如 Linux),您可能还会显示 strerror(errno)

在对 write, consider using flush 进行一些中间调用之后。

确保您的程序以正确的方式启动 working directory

在 Linux 上,您还可以使用 strace(1) 来了解您的程序完成的系统调用。

最后,你考虑过使用一些简单的 database, e.g. with sqlite, or some indexed file, e.g. with gdbm 吗?