即使在 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 -g
和 GCC) 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 吗?
我正在使用 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 -g
和 GCC) 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 吗?