用C ++读取/写入对象数据到文件 [英] Reading/writing object data to a file in C++

查看:292
本文介绍了用C ++读取/写入对象数据到文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

您好,



我是初学C ++程序员,我正在努力通过编写一个小文本游戏来开发。

现在我正在尝试编写一个很好的类来创建和管理播放器配置文件,并且最近遇到了一个问题,同时找到了一种使用fstream保存和加载播放器变量的方法。



这是我希望这个类看起来的一个例子:



Hello,

I'm a beginner C++ programmer, and I'm trying to develop by writing a little text game.
Right now I'm trying to write a nice class for creating and managing a player profile, and have recently ran into an issue while finding a way to save and load player variables using fstream.

Here's an example of how I want this class to look:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

class cPlayer;

class cPlayer
{
protected:
    string strName;
    int nSomeInteger;
    int nSomeInteger2;
public:
    cPlayer(){}
    cPlayer(string Name)
    {
        strName=Name;
        nSomeInteger=10;
        nSomeInteger2=20;
    }

    string ShowName()      {return strName;}
    int ShowSomeInteger()  {return nSomeInteger;}
    int ShowSomeInteger2() {return nSomeInteger2;}

    void SavePlayer();
    void LoadPlayer();
};

void cPlayer::SavePlayer()
{
    string strFileName=ShowName()+".dat";
    ofstream ofsSavePlayer(strFileName.c_str());
    ofsSavePlayer<<ShowName()<<endl<<ShowSomeInteger()<<endl<<ShowSomeInteger2();
}

void cPlayer::LoadPlayer()
{
    string strFileName=ShowName()+".dat";
    ifstream ifsLoadPlayer(strFileName.c_str());
    ifsLoadPlayer>>ShowName()>>endl>>ShowSomeInteger()>>endl>>ShowSomeInteger2();
}

int main()
{
    string strString;
    cin>>strString;
    cPlayer(strString);

    // - rest of the code that tests whether saving and loading went successfully. 
    // Not important right now.

    return 0;
}









现在,问题是如以下:







Now, the problem is as following:

|46|error: no match for 'operator>>' in 'std::operator>><char, std::char_traits<char>, std::allocator<char> >((* & ifsLoadPlayer.std::basic_ifstream<char>::<anonymous>), (* &((cPlayer*)this)->cPlayer::strName)) >> std::endl'|





这基本上是这一行:





It's basically this line:

ifsLoadPlayer>>strName>>endl>>nSomeInteger>>endl>>nSomeInteger2;





我怎样才能使它工作?



提前感谢任何善意的建议。 :)



How can I make it work?

Thanks in advance for any kind advice. :)

推荐答案

Quote:

ifsLoadPlayer>> ShowName()> > endl>> ShowSomeInteger()>> endl>> ShowSomeInteger2();

ifsLoadPlayer>>ShowName()>>endl>>ShowSomeInteger()>>endl>>ShowSomeInteger2();



你不能这样做。你必须写一些像


You cannot do that. You have to write something like

ifsLoadPlayer>>strName>>nSomeInteger>>nSomeInteger2;





我在roder中重写了你的代码以使其正常工作。但是,为了实现强大的实施,您应该研究序列化 [ ^ ]。





I rewrote your code in roder to make it 'working'. However, for a robust implementation you should study serialization[^].

#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
class cPlayer;
 
class cPlayer
{
protected:
    string strName;
    int nSomeInteger;
    int nSomeInteger2;
public:
    cPlayer(){}
    cPlayer(string Name)
    {
        strName=Name;
        nSomeInteger=10;
        nSomeInteger2=20;
    }
 
    string ShowName()      {return strName;}
    int ShowSomeInteger()  {return nSomeInteger;}
    int ShowSomeInteger2() {return nSomeInteger2;}
 
    void SavePlayer(const string & fname);
    void LoadPlayer(const string & fname);
};
 
void cPlayer::SavePlayer(const string & fname)
{
    string strFileName=fname+".dat";
    ofstream ofsSavePlayer(strFileName.c_str());
    ofsSavePlayer<<strName<< endl <<nSomeInteger << endl<<nSomeInteger2;
}
 
void cPlayer::LoadPlayer(const string & fname)
{
    string strFileName=fname+".dat";
    ifstream ifsLoadPlayer(strFileName.c_str());
    ifsLoadPlayer>>strName>>nSomeInteger>>nSomeInteger2;

}
 
int main()
{
    string strString;
    cin>>strString;
    cPlayer p1(strString);
    p1.SavePlayer(p1.ShowName()); // save player 1

    cPlayer p2;
    p2.LoadPlayer(p1.ShowName()); // load player 2 members  from (player 1) file

    return 0;
}</string></fstream></iostream>


这篇关于用C ++读取/写入对象数据到文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆