将文件读入矢量对象

Reading file into an vector object C++

本文关键字:对象 文件      更新时间:2023-10-16

我必须创建一个头文件,一个实现文件和主程序,所有这些都在下面看到,从文件中读取并从中计算某些东西(还没有到那部分)

在我的主程序中,您可以看到我试图将文件打开为矢量对象,但由于某种原因,它似乎无法返回此错误:error: base operand of ‘->’ has non-pointer type ‘std::ifstream {aka std::basic_ifstream<char>}’

一旦它被加载到一个向量对象中,我必须从它计算某些类型的信息,比如下雨最多的月份等。

我在头文件中重载了输入流提取,并在实现文件中实现了这种类型。

如果有任何关于如何改进代码的建议,请告诉我,谢谢

您的代码示例是错误的集合。这是我遇到的前三种,排名不分先后。我相信还有更多。

首先,file不是指针,所以需要

file.member

file->member

第二,std::ifstream没有成员MonthData。所以你不能这样做

file->MonthData ....

或者

file.MonthData ....

第三,你似乎在一些地方有MnthData,而在其他地方有MonthData

如果我有你想做的事:

  1. 打开文件。
  2. 读取一个月左右的天气和细节数据。
  3. 做一些你还没有写的处理。

首先:

ifstream file("meteorogical.data", ios::out);

只要我们假设文件存在,您就希望从文件中读取。

放在末尾的选项- ios::out设置要写入的文件,而不是要读取的文件。(见这里)你根本不想传入这个参数。因为你的流是ifstream (InputFileStream),它默认是read in (ios::in)

其次,检查它是否未打开

!file.is_open(),而只有当打开

时,您才想从它读取 第三:

file->MonthData += line + 'n';

这可能是最糟糕的台词了。首先,你忽略了类定义和类实例之间的区别。我建议有一些基本的c++教程的演练,但这一个描述类。这里的主要问题是您的MonthData是一个类定义。也就是说,您的Month应该包含的内容的蓝图,与此分开的是该Month的实例,它将指定特定月份的值和特定天气细节(例如: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