好的,所以我必须创建一个头文件,一个实现文件和主程序,所有这些都可以在下面看到从文件中读取并从中计算某些东西(还没有到那个部分)
在我的主程序中,您可以看到我试图将文件打开到矢量对象中,但出于某种原因,它似乎无法返回此错误:error: base operand of ‘->’ has non-pointer type ‘std::ifstream {aka std::basic_ifstream<char>}’
一旦将其加载到矢量对象中,我就必须从中计算某些类型的信息,例如雨量最多的月份等。
我在头文件中重载了输入流提取,并在实现文件中实现了这种类型。
如果对如何改进代码有任何建议,请告诉我们,谢谢
德尔
答案 0 :(得分:1)
您的代码示例是一组错误。这是我遇到的前三个,没有特别的顺序。我相信还有更多。
首先,file
不是指针,所以你需要
file.member
不是
file->member
其次,std::ifstream
没有成员MonthData
。所以你不能这样做
file->MonthData ....
甚至
file.MonthData ....
第三,您似乎在某些地方MnthData
,而在其他地方MonthData
。
答案 1 :(得分:0)
如果我有你想做的事情:
首先关闭:
ifstream file("meteorogical.data", ios::out);
只要我们假设文件存在,您就想要从文件中读取。
你最后选择的选项 - ios :: out设置要写入的文件,而不是读取。 (see here)您根本不想传递此参数。因为你的流是ifstream(InputFileStream),所以它默认为读入(这是ios :: in)
其次,您要检查它是否未打开
!file.is_open()
而您只想在打开
第三:
file->MonthData += line + '\n';
这可能是最糟糕的一句话。首先,您忽略了类定义和类实例之间的区别。我建议您学习一些基本的C ++教程,但this one describes classes。这里的主要问题是MonthData是一个类定义。也就是说,您的月份应该包含的蓝图,与此分开是该月的一个实例,它将指定特定月份的值和特定的天气详情(即3月份晴天)
您已经很好地编写了定义,但您仍然需要创建实例。打开文件之前的MonthData myCurrentMonth();
之类的东西。 (您已经使用string line;
)
仍然在这一行 - 我认为你基于班级定义istream & operator>>
尝试做的事情就是说file >> myCurrentMonth
。但是让我们忽略这一点,因为你不需要这样做,它不会使用你当前的代码,而且它过于复杂。相反,在您完成从文件中获取所有数据之前,请不要担心MonthData对象。将所有行存储在该字符串中,关闭该文件,然后创建MonthData。
类似的东西:
string theWholeFileText;
while (getline(file, line))
{
theWholeFileText = theWholeFileText + line + '\n';
}
file.close();
一旦您获得了文件的全文,就可以解析您希望如何查找月份数据。我没有您的文件,因此您需要检索相关数据,但最后您应该拥有传递到新MonthData实例所需的所有信息。
int y, int m, float tmax, float tmin, int af, float r, float s;
//Parsing these values from the theWholeFileText
//Plug these values into a new Class Instance of the MonthData.
MonthData monthFromFile(y, m, tmax, tmin, af, r, s);
然后最后你的处理。你提到要在istream & operator>>
内完成,但是我建议你有一个空的MonthData :: Process()函数,一旦你获得了所有数据就可以调用它。
它看起来像:
MonthData::Process(){
//process data here.
}
注意:我始终提到MonthData
,但在某些地方,您错过了拼写为MnthData
。