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

C++ 从文件读取到C+中结构中的结构数组+;,c++,struct,C++,Struct,我以前问过这个问题,一个类似的问题结束了 因此,根据另一位用户的评论,我重新定义了我的问题: 在第一篇文章中,我试图将一个文件中的数据读入一个带有结构的数组。通过使用indata>p.fId,我能够将数据文件中的值读入PersonId 现在我想试试这个: struct PersonId { int fId; }; struct PersonData { public: typedef PersonData* Ptr; PersonData();

我以前问过这个问题,一个类似的问题结束了

因此,根据另一位用户的评论,我重新定义了我的问题:

在第一篇文章中,我试图将一个文件中的数据读入一个带有结构的数组。通过使用indata>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;
}
struct PersonId
{
int-fId;
}; 
人眼结构
{
公众:
typedef PersonData*Ptr;
PersonData();
拟人fId;
istream&read(标准::istream&);
};
istream和PersonData::read(标准::istream和is)
{
is>>fId;
回报是;
}
istream&operator>>(istream&is、PersonData&p)
{
//is>>p.fId;
返回p.read(is);
}
int main()
{
ifstream indata;//indata类似于cin
int i;
open(“persons.txt”,ios::in);//打开文件
如果(!indata)
{//无法打开文件
coutp[i];
i++;
}
对于(i=0;i
istream& operator >> (istream& is, PersonId &p)
{
    is >> p.fId;
    return is;
}
缺失,在struct PersonId之后

需要这样才能使is>>fId inside read()正常工作

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

很好


在一个文体笔记上,现在你在C++中,不要使用Malc,使用新的,更好的,使用一个STD::向量,它会为你处理尺寸。

好的,首先有些抱怨:-你说你想要的。你写了你怎么尝试。很棒。我猜结果不是你所期望的。但是你没有告诉我们你得到的结果是什么,为什么你会失望。ted。当我看到你的代码时,它不应该编译。问题在于:

istream& PersonData::read(std::istream& is) 
{
    is >> fId;
    return is;
}
我看不到为PersonId类型定义的任何运算符>>,fId是PersonId类型。我说的对吗?或者可能在某个地方定义了运算符>>,而您并没有将其粘贴到您的问题中?我的水晶球不清楚。 如果我猜对了,Dave Gamble给出了解决方案:

istream& operator >> (istream& is, PersonId &p)
{
    is >> p.fId;
    return is;
}
你写了“在尝试访问PersonData时仍有错误”。我似乎这次Dave的水晶球也不清楚,他不能说你有什么问题。我也不能。你必须向我们提供详细信息或向我们发送更好的水晶球。也许你错过了他的另一个建议“另外,修复cout以使用p[I].fId.fId。”这意味着,与其写

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

<代码> CUT 1。第三次发布代码,我仍然看不到任何问题。2。如果你在C++中写的话,不要使用Maloc(除非你是在重写运算符new或类似的东西)。你应该写P=新的Pu饰物数据[n];最后删除[]。p;3.我看不到operator>>对Personic的任何实现。这里应该有一个新的徽章“灵能”--在没有提出任何问题时给出了答案:-@tkpoec,我正在试图解决一些我不知道的问题。是的,我在问/构思问题时绊倒了。我想你一定已经有了批评家徽章:P@tkopec谢谢你,你真是太棒了数字24的墨迹。是的,它几乎是不可思议的,不是吗?蓝色。海伦。斑点。我可以整天继续。@vivekv80如果有用的话,请随意选择这个答案;)在cout?我说过要把它改成cout
cout << "PersonData [" << i << "] is " << p[i].fId.fId << endl;