Проблема с получением информации от пользователя - PullRequest
2 голосов
/ 21 августа 2010

Вот код:

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;
};

Ответы [ 3 ]

0 голосов
/ 21 августа 2010

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

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

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

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 голосов
/ 21 августа 2010

У меня есть cin.clear() перед циклом while, и я изменил параметр GetCH, чтобы получить целую строку с помощью getline и вернуть только первую букву.

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

Теперь это работает как шарм,Спасибо всем за помощь.

0 голосов
/ 21 августа 2010

Вам нужно очистить все доступное во входном потоке, как показано ниже

cin.clear();

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