从.txt文件初始化对象向量

时间:2011-07-03 18:04:35

标签: c++ object data-structures file-io

#include<iostream>
#include<vector>
#include<fstream>
#include "stock.h"
int main(){
    double balance =0, tempPrice=0;
    string tempStr;

    vector < Stock > portfolio;
    typedef vector<Stock>::iterator StockIt;

    ifstream fileIn( "Results.txt" );
    for(StockIt i = portfolio.begin(); i != portfolio.end(); i++)
    {

        while ( !fileIn.eof( ))
        {
            getline(fileIn,tempStr);
            i->setSymbol(tempStr);

            fileIn >> tempPrice;
            i->setPrice(tempPrice);

            getline(fileIn,tempStr);
            i->setDate(tempStr);
        }
        fileIn.close();
    }
    for(StockIt i = portfolio.begin(); i != portfolio.end(); i++){
        cout<<i->getSymbol() <<endl;
        cout<<i->getPrice() <<endl;
        cout<<i->getDate() <<endl;
    }
    return 0;

}

示例文本文件Results.txt:

GOOG    569.964 11/17/2010
MSFT    29.62   11/17/2010
YHOO    15.38   11/17/2010
AAPL    199.92  11/17/2010

现在很明显,我想让这个程序创建一个Stock对象的向量,它具有对象的适当的set / get功能:Stock(string, double, string)

完成后,我想打印出向量中每个Object的每个成员。

让我对fstream感到困惑的一件事是,它如何破译空格和行尾,并智能地读取字符串/整数/双精度并将它们放入适当的数据类型?也许它不能......我必须添加一个全新的功能?

现在似乎我实际上并没有为循环的每次迭代创建一个新对象?我认为需要做一些事情:

portfolio.push_back(new Stock(string, double, string));?我只是不完全确定如何达到这一点。

此外,此代码应与std::list以及std::vector互换。这个程序编译没有错误,但输出为零。

2 个答案:

答案 0 :(得分:5)

首先,迭代向量只有在它不为空时才有意义。所以删除该行:

for(StockIt i = portfolio.begin(); i != portfolio.end(); i++)

因为否则将永远不会执行此循环的内容。

其次,您的输入读数存在问题:您对第一个字段使用getline,这会将行中所有3个字段的值读入tempStr变量。

第三,你不应该使用while(!fileIn.eof()) - eof函数只有在尝试读取文件末尾之后才返回true 。相反,使用:

while (fileIn >> symbol >> price >> date) {
    //here you should create a Stock object and call push_back on the vector.
}

这将读取三个字段,用空格分隔。

答案 1 :(得分:1)

您的代码中几乎没有问题。 第一个for循环在一个空的投资组合向量上运行,因为向量未初始化(没有对象被推送到它),begin()和end()是相同的。 你应该从fstream逐行读取直到EOF,然后将对象推送到向量。 你读过的每一行,你应该将(标记化)分成3个部分,并创建一个新的Stock对象以推送到向量。

另一方反馈,每当使用stl迭代器时,使用++ itr on for循环,它将运行得更快