我之前已经问过这个问题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定义的结构中的值。 我的问题:
如何将文件中的数据读入PersonId结构中,该结构存储在PersonData结构中?
在阅读PersonData [i]时,我应该看到它有一个具有更新值的结构PersonId。
我希望我的问题现在清楚了吗?
答案 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 ::前缀可能会有所帮助(当然,如果这是你的问题)。