2010-08-21 2 views
2

Вот код:Проблема получения входного сигнала от пользователя

cout << "Please enter the file path: "; 
string sPath; 
getline(cin, sPath); 
cout << "Please enter the password: "; 
string sPassword; getline(cin, sPassword); 

Проблема заключается в том, когда я запускаю его он отображает «Пожалуйста, введите путь к файлу:» Затем он отображает «Пожалуйста, введите пароль:», а затем ждет пароль. Кажется, он полностью пропустил первый 'getline()'.

Позже редактирование: Да, некоторые операции ввода выполняются ранее.

int iOption = 0; 
while (iOption == 0) 
{ 
    cout << "(E/D): "; 
    switch (GetCH()) 
    { 
    case 'E': 
     iOption = 1; 
     break; 
    case 'e': 
     iOption = 1; 
     break; 
    case 'D': 
     iOption = 2; 
     break; 
    case 'd': 
     iOption = 3; 
     break; 
    default: 
     break; 
    } 
} 

И код для GetCH() в случае, если кто-либо спросит.

char GetCH() 
{ 
    char c; 
    cin >> c; 
    return c; 
}; 
+2

Это полный код? Выполняли ли вы какие-либо операции ввода до выполнения этого кода? –

ответ

0

Похоже, остальная часть линии, которая была вход для GetCH по-прежнему остается в буфере в то время, когда вы звоните getline , т.е. не менее \n, и это то, что вы читаете в первом вызове getline. Программа не блокирует ожидание ввода пользователя, потому что запрос getline может быть удовлетворен частичной линией, все еще поставленной в очередь для чтения.

Рассмотрите возможность изменения функции GetCH, чтобы читать целые строки.

E.g. что-то вроде (полностью тестировался, я боюсь):

int GetCH() 
{ 
    std::string inputline; 

    // Read until error or we receive a non-empty line 
    while(std::getline(std::cin, inputline) && inputline.empty()) 
    { 
    } 

    return inputline.empty() ? EOF : inputline[0]; 
} 
0

Вы должны очистить все, что имеется в наличии входного потока, как показано ниже

cin.clear(); 

cin.ignore(std::numeric_limits<std::streamsize>::max()) 
+0

Вторая строка, похоже, не работает. Это дает мне 2 ошибки (я добавил полуколонну). – Andrew

0

У меня есть cin.clear() перед время цикла и изменили вариант Геч, чтобы получить целую строку с «GetLine» и только вернуть первую букву.

char GetCH() 
{ 
    string c; 
    getline(cin, c); 
    return c[0]; 
}; 

Теперь он работает как очарование. Спасибо всем за помощь.

+0

Хотя совершенно правильно ответить на ваш собственный вопрос, если вы по существу дублируете другие ответы, имеет смысл вознаградить один из других ответов «принятие», а не дублировать его в другом ответе. Я не «умоляю» о принятии (у меня достаточно принятия в другом месте!); просто заметив, что вам может понадобиться какое-то руководство относительно того, как работает stackoverflow.com. –

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