【问题标题】:Reading from a file to a vector从文件读取到向量
【发布时间】:2018-05-01 19:33:54
【问题描述】:

我正在读取包含以下数据的文件。我需要实现的是最后用具有 CTurist 对象的 CHotel 对象填充向量 m_hoteli。第 2-5 行是有变量的酒店,在大数字(500,400,300,600)之后,就是每个酒店的游客。

当我运行它时,我的向量会填充来自文件的信息,但会将有关游客的详细信息填充为酒店数据,因此我无法在输入和 CTurist 之间建立正确的连接。

玛丽娜 5 500 乔 21 1 蒂绍 20 6 维多利亚 31 20

郁金香 4 400 莎拉 41 17 罗西莎 49 14 瓦莱里娅 24 2

黑海 3 300 约翰 35 12 乔恩 35 11 詹尼 28 6

瑞士贝尔 5 600 欧林 26 1 玛格丽塔 27 2 朱丽叶 31

class CComplex:CHotel
{

protected:
    string m_complex;
    vector<CHotel> m_hoteli;
public:
    CComplex(){};

CComplex(string filename, string nComplex)
{
    string str;
    m_complex = nComplex;
    fstream file(filename, ios::in);
    if (file.is_open())
    {
        CHotel temp(" ", 0, 0);
        while (file >> temp)
        {
            m_hoteli.push_back(temp);

        }
        file.close();
    }
    else
        throw "ERROR! ";
        }

CHotel(String stringname) 构造函数:

class CHotel : public CTurist          //втори клас, наследник на CTurist
{
protected:

    string hName;    //име хотел
    int stars;          //звезди на хотела
    int beds;           //брой легла

public:
    map<CTurist, unsigned> Turisti; 
        unsigned Sum = 0;
    int br = 0;
    CHotel(){};
    CHotel(string s)
        {
            map<CTurist, unsigned> TR;

            bool first = true;
            istringstream TList(s);
            int i = 0;

            while (getline(TList, s, ' '))
            {
                switch (i)
                {
                case 0: this->setName(s); break;
                case 1: this->setAge(stoi(s)); break;
                }

                if (i ==2 )
                {
                    if (!first){ setName(getName()); setAge(getAge()); first = true; }
                    else{ TR[CTurist("", 0)]; }
                    i = -1;
                }
                i++;
            }
            Turisti = TR;
        }

【问题讨论】:

  • 是的,文件已打开。不过,我会检查一下,注意。我的问题是,当我阅读文件时,我不知道如何访问 CTurist 及其输入运算符,因此在我的向量中,我将 Tourists 写为酒店。
  • 时髦。所以问题是你没有很好的方法让解析器从酒店告诉游客?如果我没看错,您想getline 整行,然后拆分该行。上线的前几个代币是酒店,其余的是住在酒店的人,是吗?
  • @user4581301 没错。我已经发布了一个我已经更新的新代码,我认为它接近正确,但仍然给我带来了一些麻烦。如果你能看一看,那就太好了。

标签: c++ file class vector stdmap


【解决方案1】:

这是我认为我在构造函数上取得的一些进步。通过断点查看,酒店收到了它的信息,也就是名字、星级和床位,但游客没有。有什么建议吗?
CHotel(字符串 s) {

    CTurist b("",0);
    bool first = true;

    istringstream TList(s);

    string Days;
    int i = 0;
    string ime;
    string godini;

    if (first == true)
    {

    while (getline(TList, s, ' '))
    {
        switch (i)
        {
        case 0: this->hName = s; break;
        case 1:this->stars = stoi(s); break;
        case 2:this->beds = stoi(s); break;

        }
        i++;
        if (i == 3)break;

    }
    first = false;
    i = 0;
}
    while (getline(TList, s, '|'))
    {
        switch (i)
        {

        case 0: ime = s; break;
        case 1: godini = s; break;
        case 2: Days = s; break;


        }
        i++;
        if (i == 3)
        {
            CTurist T1("ime", stoi(Days));
            //Turisti.insert(pair<CTurist,unsigned>("ime", stoi(Days))); 


                i = 0;
            }
        }
    }

如何将T1插入mapTuristi???

【讨论】:

    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多