C ++ Потоковый текстовый файл ввода / вывода в массив - PullRequest
0 голосов
/ 23 ноября 2011

Мой код должен прочитать 16 строк из текстового файла и передать их в массив из 4 объектов, каждый из которых имеет 4 атрибута.Проблема, с которой я сталкиваюсь, заключается в том, что, хотя при передаче текстовых деталей в массив все работает нормально, первый элемент массива последнего объекта в массиве не тот, который должен быть!Я действительно застрял!

Мой код:

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int CDsize;

class CD {
public:
    // constructors
    CD();
    CD(string arist, string title, int year, double price);

    // getter methods
    string getArtist() const { return this->artist; }
    string getTitle() const { return this->title; }
    int getYear() const { return this->year; }
    double getPrice() const { return this->price; }

    // setter methods - inline functions
    void setArtist(const string artist) { this->artist = artist; }
    void setTitle(const string title) { this->title = title; }
    void setYear(const int year) { this->year = year; }
    void setPrice(const double price) { this->price = price; }

    // option methods
private:
    string artist;
    string title;
    int year;
    double price;
};

/*Text menu option 1/*
void printallcds(CD MAX_CDS[])
{
     int d;
  for (d=0; d<=CDsize; d++)

  {
    cout << "CD Number : " << d << "/ Artist : " << MAX_CDS[d].getArtist() << "/
Title : " << cout << MAX_CDS[d].getTitle() << "/ Year of Release : " <<
MAX_CDS[d].getYear() << "/ Price : " <<
  cout << MAX_CDS[d].getPrice() << endl;
  }
}*/

int main() {
    CD MAX_CDS[3];
    int CDsize = (sizeof(MAX_CDS) / sizeof(MAX_CDS[0]));
    ifstream CDfile("mystock.txt");
    string data;
    int yeardata;
    double pricedata;
    int i;

    for (i = 0; i < 4; i++) {
        getline(CDfile, data);
        MAX_CDS[i].setArtist(data);

        getline(CDfile, data);
        MAX_CDS[i].setTitle(data);

        getline(CDfile, data);
        stringstream yearstream(data);
        yearstream >> yeardata;
        MAX_CDS[i].setYear(yeardata);

        getline(CDfile, data);
        stringstream pricestream(data);
        pricestream >> pricedata;
        MAX_CDS[i].setPrice(pricedata);
    }

    CDfile.close();

    // testing
    cout << MAX_CDS[3].getArtist() << endl; // error !!!
    cout << MAX_CDS[3].getTitle() << endl;
    cout << MAX_CDS[3].getYear() << endl;
    cout << MAX_CDS[3].getPrice() << endl;

    return 0;
}

// constructors implementation
CD::CD() {}

CD::CD(string artist, string title, int year, double price) {
    this->artist = artist;
    this->title = title;
    this->year = year;
    this->price = price;
}
}

1 Ответ

2 голосов
/ 23 ноября 2011

У вас есть место только для 3 элементов в MAX_CDS (см. CD MAX_CDS[3];), но вы ссылаетесь на 4-й элемент в своей ошибке.

MAX_CDS[3] // Actually represents the 4th item

Подсчет начинается с 0 в C ++.

Итак, для ссылки на 3-й элемент, в вашем случае последний элемент, используйте MAX_CDS[2] или MAX_CDS[CDSize-1].

cout << MAX_CDS[CDSize-1].getArtist() << endl;
cout << MAX_CDS[CDSize-1].getTitle() << endl;
cout << MAX_CDS[CDSize-1].getYear() << endl;
cout << MAX_CDS[CDSize-1].getPrice() << endl;

Перечитывая свой вопрос, вы, вероятно, хотите больше предметов!

CD MAX_CDS[4]; // Now you have 4 items available: indexed 0, 1, 2, and 3
...