如果我有你想做的事:
- 打开一个文件。
- 读取一些数据大约一个月的天气和细节。
- 对其进行一些您尚未编写的处理。
首先:
ifstream file("meteorogical.data", ios::out);
只要我们假设文件存在,您就想从文件中读取。
您放在最后的选项 - ios::out 将文件设置为写入,而不是读取。 (see here) 你根本不想传入这个参数。因为你的流是ifstream(InputFileStream),所以默认是read in(也就是ios::in)
其次,您正在检查它是否未打开
!file.is_open() 而您只想在它打开时读取它
第三:
file->MonthData += line + '\n';
这可能是最糟糕的路线。首先,您缺少类定义和类实例之间的区别。我建议您浏览一些基本的 C++ 教程,但 this one describes classes。这里的主要问题是您的 MonthData 是一个类定义。也就是说,您的月份应包含的内容的蓝图,与此分开的是该月份的一个实例,它将指定特定月份的值和特定的天气详细信息(例如,三月是晴天)
您已经很好地编写了定义,但您仍然需要创建实例。在您打开文件之前,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>> 中执行此操作,但我建议您在获取所有数据后调用一个 void MonthData::Process() 函数。
看起来像:
MonthData::Process(){
//process data here.
}
注意:我自始至终都提到了MonthData,但在某些地方你把它拼错了MnthData。