Инициализация вектора объектов из файла .txt - PullRequest
0 голосов
/ 03 июля 2011
#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, который имеет соответствующий набор /получить функциональность для объекта: Stock(string, double, string).

Как только это будет сделано, я хочу распечатать каждый отдельный элемент каждого объекта в векторе.

Одна вещь, которая поражает мое мнение о fstream, заключается в том, как она может расшифровать пробелы и конец строк, а также грамотно прочитать строки / целые / двойные числа и поместить их в соответствующий тип данных?Может быть, он не может ... и мне нужно добавить совершенно новую функциональность?

теперь может показаться, что я не создаю новый объект для каждой итерации цикла?Я думаю, нужно было бы сделать что-то вроде:

portfolio.push_back(new Stock(string, double, string));?Я просто не совсем уверен, как добраться до этой точки.

Кроме того, этот код должен быть взаимозаменяемым с std::list, а также std::vector.Эта программа компилируется без ошибок, однако выходной сигнал равен нулю.

Ответы [ 2 ]

5 голосов
/ 03 июля 2011

Прежде всего, перебор вектора имеет смысл только тогда, когда он не пустой.Поэтому удалите строку:

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 голос
/ 03 июля 2011

Мало проблем в вашем коде.первый цикл for выполняется по пустому вектору портфолио, так как вектор не инициализирован (объекты не помещаются в него), begin () и end () одинаковы.Вы должны читать построчно от потока до EOF, а затем помещать объекты в вектор.в каждой строке, которую вы читаете, вы должны разбить (токенизировать) на 3 части и создать новый объект Stock, который будет помещен в вектор.для циклов он будет работать намного быстрее

...