将文件读入矢量对象C ++

时间:2014-03-16 18:18:31

标签: c++ vector getline

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

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

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

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

如果对如何改进代码有任何建议,请告诉我们,谢谢

德尔

2 个答案:

答案 0 :(得分:1)

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

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

file.member

不是

file->member

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

file->MonthData ....

甚至

file.MonthData ....

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

答案 1 :(得分:0)

如果我有你想做的事情:

  1. 打开一个文件。
  2. 在大约一个月的天气和详细信息中阅读一些数据。
  3. 对它进行一些处理,但尚未编写。
  4. 首先关闭:

    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