2016-02-23 6 views
-1

Моя программа должна создать простой список: name (string), rating (int), watched/unatched (string). Понимаю, что с помощью std::cin>> уходит '\n' в конце, поэтому я должен использовать cin.ignore(), но, похоже, он каким-то образом не работает.Использование cin AFTER getline (cin, string)

void write() 
{ 
    int rating; 
    string name, watch, wprint; 
    cout << "Modifying" << endl; 
    f_list.open ("TextFile.txt", ios::app); 
    cout << "Name/Title?" << endl; 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    getline(cin, name); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    cout << "Rating?" << endl; 
    if (!(cin >> rating)); 
    { 
     cin.clear(); 
     cout << "Error again" << endl; 
    } 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    cout << "Watched or unwatched?" << endl; 
    getline(cin, watch); 
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
    if (watch == "w" || watch == "yes" || watch == "y") 
    { 
     watch = "W"; 
     wprint = "Watched"; 
    } 
    else 
    { 
     watch = "DW"; 
     wprint = "Didn't watch"; 
    } 
    cout << name << " (" << rating << "/10) (" << wprint << ") has been added to the list" << endl; 
    f_list << name << " " << rating << " " << watch << endl; 
} 

Первый мой cin >> rating всегда ноль не было, независимо от того, что я сделал, и он также вернулся ошибки и пошел в бесконечном цикле. Затем я НЕОБХОДИЛ исправление, но я не знаю, как и теперь мои 2 getline() s нужно ввести ДВАЖДЫ!

Может ли кто-нибудь объяснить, почему это не работает для меня? И какие части этого кода не нужны?

My input looks like this

+1

'std :: getline' не оставляет' \ n' в буфере, форматированное извлечение делает! Вы очищаете ввод. – LogicStuff

+0

... Q & A вы опасались, что ваш вопрос помечен как дубликат, не говорит, что вызывается 'std :: istream :: ignore' между каждым извлечением. – LogicStuff

ответ

0

Я понимаю, что использование std::cin>> оставляет '\n' в конце, так что я должен использовать cin.ignore()

Первая часть верна. Вторая часть верна, только если вы хотите следить за ней по телефону getline.

Однако вы звоните в cin.ignore() еще до первого звонка на номер std::cin >>. Это будет означать, что вы будете вводить строки, которые могут быть пустыми строками, но линии не считаются, строки будут считаны и отброшены.

Заменить строки:

cin.ignore(numeric_limits<streamsize>::max(), '\n'); 
getline(cin, name); 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

только с

getline(cin, name); 

Также немного позже, у вас есть:

getline(cin, watch); 
cin.ignore(numeric_limits<streamsize>::max(), '\n'); 

Вам не нужно вызов cin.ignore() здесь , Убери это.

+0

Хорошо, спасибо! Я понимаю это сейчас, для меня остается еще один вопрос: почему я все еще получаю сообщение об ошибке с моим рейтингом 'cin >>? Я имею в виду, что я получаю номер, который я ввел, но мой оператор 'if' говорит, что это ошибка. – DownTownScarf7

+0

@ DownTownScarf7, у вас есть странствующий ';' в строке 'if (! (Cin >> rating)); 'который завершает оператор' if'. Это нужно удалить. –

0

Вы не должны вызывать std::istream::ignore(), если вы действительно не знаете , что есть что-то, чтобы игнорировать уже в буфере. Если вы назовете его пустым буфером, ему сначала нужно будет заполнить его - возможно, с полезными данными - и затем игнорировать все.

Смежные вопросы