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

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

本文关键字:对象 保存 之后 C++ 中的 fstream clear      更新时间:2023-10-16

我正在使用C++为我的学校项目编写音乐记忆游戏,此处Player对象未保存在PLAYER_DATA中。DAT 文件即使我尝试了 clear(( 函数

这是代码的和平(因为整个代码是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<<"tt      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 -g使用 GCC(,然后使用调试器(例如 gdb (。

仔细阅读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进行一些中间调用后,考虑使用 flush

确保您的程序在正确的工作目录中启动。

在 Linux 上, 你也可以使用 strace(1( 来理解程序完成的系统调用。

最后,您是否考虑使用一些简单的数据库,例如使用sqlite,或者使用一些索引文件,例如使用gdbm?