【问题标题】:Reading file into an vector object C++将文件读入矢量对象 C++
【发布时间】:2014-04-21 20:40:19
【问题描述】:

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

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

一旦将其加载到矢量对象中,我必须从中计算某些类型的信息,例如降雨量最多的月份等。

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

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

删除

【问题讨论】:

  • 天啊,我们需要多少个?他们需要做的就是在 StackOverflow 上搜索“c++ 文件读取向量”。
  • SO 已变成“为我修复错误”论坛。

标签: c++ vector getline


【解决方案1】:

您的代码示例是错误的集合。这是我遇到的前三个,没有特别的顺序。我相信还有更多。

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

file.member

不是

file->member

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

file->MonthData ....

甚至

file.MonthData ....

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

【讨论】:

  • 使用 >> 运算符,看起来他们正在尝试归档 >> someInstanceOfMonthData,但没有创建实例,而是传入类名。此外,打开该文件以写入 ( ios::out),但从中读取。
  • @Jono 是的,看起来像。实在是太乱了。
【解决方案2】:

如果我有你想做的事:

  1. 打开一个文件。
  2. 读取一些数据大约一个月的天气和细节。
  3. 对其进行一些您尚未编写的处理。

首先:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多