getline принимает только часть информации

class MovieData
{
private:
    string Title;
    string Director;
    int Year;
    int Time;

public:
    MovieData();
    void setTitle(string Title);
    void setDirector(string Director);
    void setYear(int Year);
    void setTime(int Time);
    string getTitle();
    string getDirector();
    int getYear();
    int getTime();
};

MovieData::MovieData()
{
    Title = "";
    Director = "";
    Year = 0;
    Time = 0;
}    

void MovieData::setTitle(string title)
{
    Title = title;
}    

void MovieData::setDirector(string director)
{
    Director = director;
}

void MovieData::setYear(int year)
{
    Year = year;
}

void MovieData::setTime(int time)
{
    Time = time;
}

string MovieData::getTitle()
{
    return Title;
}

string MovieData::getDirector()
{
    return Director;
}

int MovieData::getYear()
{
    return Year;
}

int MovieData::getTime()
{
    return Time;
}

void readMovieData(MovieData *, int);
void MovieDatastats(MovieData *, int);

Это мой класс, определение и прототип функций здесь.... они все в одном и том же main.cpp Вот мое тело

int main()
{
    int amount = 0;
    cout << "How many movies did you watch last month? ";
    cin >> amount;

    MovieData *pMovie;
    pMovie = new MovieData[amount];

    cout << "Please enter the information of your Movies!" << endl;
    readMovieData(pMovie, amount);

    cout << "\nHere are the information with your Movies!" << endl;
    MovieDatastats(pMovie, amount);

}

Для тех, кто помогал мне раньше, я исправил это через свою функцию-прототип. У меня было (MovieData *pMovie, int const size) в качестве параметров, когда это было не нужно. Очень ценил помощь! Мне не нужно было дважды вызывать один и тот же объект, он конфликтует друг с другом. а теперь вот для моей функции, на которой я застрял, и я не знаю, почему...

void readMovieData(MovieData *pMovie, int const size)
{
    string title;
    string director;
    int year;
    int time;

    for(int i = 0; i < size; i++)
    {
        cout << "\nPlease enter the Title of the movie: ";
        getline(cin,title);
        pMovie[i].setTitle(title);

        cin.ignore();

        cout << "Please enter the Director name of the movie: ";
        getline(cin,director);
        pMovie[i].setDirector(director);

        cin.ignore();

        cout << "Please enter the year it was released: ";
        cin >> year;
        if(year >= 1900 && year <= 2004)
            pMovie[i].setYear(year);
        else
        {
            cout << "\nPlease enter a year between 1900 and 2004." << endl;
            year = 0;
            system("PAUSE");
            break;
        }

        cout << "Please enter the time the movie last: ";
        cin >> time;
        if(time > 0 && time < 14400)
            pMovie[i].setTime(time);
        else
        {
            time = 0;
            cout << "\nPlease enter a time between 0 and 14400 in minutes." << endl;
            system("PAUSE");
            break;
        }
    }
}

void MovieDatastats(MovieData *pMovie, int const size)
{
    float sumTime = 0.0;
    float averageTime = 0.0;
    for (int i = 0; i < size; i++)
    {
        sumTime +=pMovie[i].getTime();
    }
    averageTime = sumTime/size;

    cout << "\nYour average time of all your movie is: " << averageTime << endl;

    int oldYear = 0;
    int count = 0;
    int recentYear = 0;
    int counter = 0;

    oldYear = pMovie[0].getYear();
    recentYear = pMovie[0].getYear();

    for (int j = 1; j < size; j++)
    {
        if(pMovie[j].getYear() < oldYear)
        {
            oldYear = pMovie[j].getYear();
            count = j;
        }
        else if(pMovie[j].getYear() > recentYear)
        {
            recentYear = pMovie[j].getYear();
            counter = j;
        }
    }

    cout << "\nThe oldest Movie you have watched is called..." << endl;
    cout << "Title: " << pMovie[count].getTitle() << endl;
    cout << "Director: " << pMovie[count].getDirector() << endl;
    cout << "Release Year: " << pMovie[count].getYear() << endl;

    cout << "\nThe most newest Movie you have watched is called..." << endl;
    cout << "Title: " << pMovie[counter].getTitle() << endl;
    cout << "Director: " << pMovie[counter].getDirector() << endl;
    cout << "Release Year: " << pMovie[counter].getYear() << endl;
}

Как только я запускаю программу и ввожу информацию, я могу ввести название и имя режиссера, но как только я доберусь до того, когда я получу год, программа больше ничего не примет и завершит работу. Как видно из вывода ниже, он пропустил заголовок и удалил первую букву слова. Как я могу это исправить?

Вот мой вывод.

Сколько фильмов вы посмотрели в прошлом месяце? 2

Пожалуйста, введите информацию о ваших фильмах!

Пожалуйста, введите название фильма: Атака акулы

Пожалуйста, введите имя режиссера фильма: Случайное имя

Укажите год выпуска:

Пожалуйста, введите год между 1900 и 2004.

Нажмите любую клавишу для продолжения . . .

Вот информация с вашими фильмами!

Ваше среднее время просмотра всего вашего фильма: 0

Самый старый фильм, который вы смотрели, называется...

Заголовок:

Режиссер: Харк Атака

Год выпуска: 0

Самый новый фильм, который вы смотрели, называется...

Заголовок:

Режиссер: Харк Атака

Год выпуска: 0

Процесс вернул 0 (0x0) время выполнения: 19,781 с Нажмите любую клавишу, чтобы продолжить

.


person user3345335    schedule 11.03.2014    source источник


Ответы (2)


После cin >> amount; у вас все еще есть новая строка в потоке, поэтому новая строка будет назначена title при вызове getline(cin,title), title будет пустой. Затем вы вызываете ignore() с параметрами по умолчанию: streamsize n = 1, int_type delim = traits_type::eof() который отбрасывает один введенный вами символ, если программа не получила EOF. Вам не нужно вызывать ignore() после getline().
Удалите все cin.ignore(); и добавьте эту строку: cin.ignore(A_BIG_NUMBER, '\n'); над getline(cin, title);, это сработает.

person jfly    schedule 11.03.2014
comment
Один вход не нарушит работу функции getline, после getline вам нужно иметь cin.ignore(), чтобы сбросить входные значения. - person user3345335; 11.03.2014
comment
вам нужно игнорировать новую строку, вызвав std::cin.ignore(10000, '\n'); перед вызовом getline(). попробуй отладить, увидишь. - person jfly; 11.03.2014
comment
Спасибо! Теперь работает нормально! Можете ли вы объяснить функцию cin.ignore(10000, '\n'), чтобы я мог учиться =) - person user3345335; 11.03.2014
comment
взгляните на эту ссылку - person jfly; 12.03.2014

Вы нарушаете цикл for с помощью break после system("PAUSE")

person Chike    schedule 11.03.2014
comment
я ломаю его, если он не работает. Если это сработает, оно будет выполнено - person user3345335; 11.03.2014