从文件读取到C ++中的结构中的结构数组

时间:2009-08-05 14:09:29

标签: c++ struct

我之前已经问过这个问题here,并且关闭了类似的问题。

根据其他用户的评论,我已经重新提出了我的问题:

在第一篇文章中,我试图将文件中的数据读入带结构的数组中。使用indata<< p [i]并且是>> p.fId,我能够将数据文件中的值读入PersonId。

现在我想尝试一下:

struct PersonId
{
    int fId;
}; 

struct PersonData
{
    public:
        typedef PersonData* Ptr;
        PersonData();
        PersonId fId;
        istream& read(std::istream&);
};

istream& PersonData::read(std::istream& is) 
{
    is >> fId;
    return is;
}

istream& operator >> (istream& is, PersonData &p)
{
    // is >> p.fId;
    return p.read(is);
}

int main ()
{
    ifstream indata; // indata is like cin
    int i;
    indata.open("persons.txt", ios::in); // opens the file

    if(!indata) 
    { // file couldn't be opened
          cout << "Error: file could not be opened" << endl;
          exit(1);
    }

    int n = 5;

    PersonData* p;
    p = (PersonData*) malloc (n * sizeof(PersonData));


    while ( !indata.eof() )
    { 
        indata >> p[i];
        i++;
    }

    for(i = 0; i < n; ++i)
    {
        cout << "PersonData [" << i << "] is " << p[i] << endl;
    }
    return 0;
}

我想使用成员函数“read”来实际读取由PersonData定义的结构中的值。 我的问题:

  1. 如何将文件中的数据读入PersonId结构中,该结构存储在PersonData结构中?

  2. 在阅读PersonData [i]时,我应该看到它有一个具有更新值的结构PersonId。

  3. 我希望我的问题现在清楚了吗?

2 个答案:

答案 0 :(得分:2)

你有:

istream& operator >> (istream& is, PersonId &p)
{
    is >> p.fId;
    return is;
}

缺少,在struct PersonId之后;

你需要这个来制作is&gt;&gt;读取()内部的工作正常。

另外,修复cout以使用p [i] .fId.fId。

效果很好!

在风格上,现在你使用的是C ++,不要使用malloc,使用new,更好的是,使用std :: vector&lt;&gt ;,这将为你调整大小。

答案 1 :(得分:1)

好的,首先有些抱怨:-)你说出你想要的东西。你写了你如何尝试。大。我猜结果不是你的预期。但你没有告诉我们你得到的结果是什么,以及你为什么对它感到失望。当我查看你的代码时,它不应该编译。问题出在这里:

istream& PersonData::read(std::istream& is) 
{
    is >> fId;
    return is;
}

我看不到任何运算符&gt;&gt;为PersonId类型定义,fId类型为PersonId。我对吗?或者可能有运营商&gt;&gt;在某处定义,你不只是将它粘贴到你的问题中?我的水晶球还不清楚。 如果我猜对了,Dave Gamble给出了解决方案:

istream& operator >> (istream& is, PersonId &p)
{
    is >> p.fId;
    return is;
}

您写道“在尝试访问PersonData时仍然遇到错误”。我好像这次戴夫的水晶球也不清楚,他不能说你有什么问题。我也不能。您必须向我们提供详细信息或向我们发送更好的水晶球。也许你错过了他的另一个建议“另外,修复cout使用p [i] .fId.fId。”这意味着,而不是写

cout << "PersonData [" << i << "] is " << p[i] << endl;

你应该写

cout << "PersonData [" << i << "] is " << p[i].fId.fId << endl;

还可能存在另一个问题 - 你不是指代std命名空间成员 - 有时你写的是istream,有时你写std :: istream,你写的是endl而不是std :: endl。也许Koenig的查找为你工作,我不擅长,但添加std ::前缀可能会有所帮助(当然,如果这是你的问题)。