getline() чудит
От: DukeNukem3D Россия  
Дата: 19.05.08 06:00
Оценка:
Делаю так:

class clsEmployee
{
    private:

        string sName;
        unsigned int uiEmployeeID;
        static unsigned int uiEmpCounter;

    public:

        clsEmployee()
        {
            uiEmpCounter++;
            uiEmployeeID = uiEmpCounter;
        }

        void Print()
        {
            cout << "Name " << setw(40) << sName << " ID " << uiEmployeeID << endl;
        }

        void Set()
        {
            cout << "Enter Name of the employeer" << endl;
            getline(cin, sName, '\n');
        }
};

unsigned int clsEmployee::uiEmpCounter;

int main()
{
    short siCounter = 0;
    clsEmployee Employee[10];
    string strEmpName;
    char cCheck;

    do
    {
        Employee[siCounter].Set();
        if (siCounter == 9)
        {
            cout << "Enough!" << endl;
            break;
        }
        else
        {
            cout << "Wanna enter more? (y/n) >";
            cin >> cCheck;
        }
        siCounter++;

    for ( int i = 0; i < siCounter; i++)
    {
        Employee[i].Print();
    }

    return 0;
}


Судя по коду, должно попросить 10 раз ввести данные и вывести их, но происходит следующее:


Enter Name of the employeer
a
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >b
Enter Name of the employeer
Wanna enter more? (y/n) >c
Enter Name of the employeer
Wanna enter more? (y/n) >d
Enter Name of the employeer
Wanna enter more? (y/n) >e
Enter Name of the employeer
Wanna enter more? (y/n) >f
Enter Name of the employeer
Wanna enter more? (y/n) >g
Enter Name of the employeer
Wanna enter more? (y/n) >h
Enter Name of the employeer
Wanna enter more? (y/n) >i
Enter Name of the employeer
Enough!
Name                                        a ID 1
Name                                          ID 2
Name                                          ID 3
Name                                          ID 4
Name                                          ID 5
Name                                          ID 6
Name                                          ID 7
Name                                          ID 8
Name                                          ID 9


я как-то неправильно getline использую?
С уважением, Андрей
c++ getline()
Re: getline() чудит
От: php-coder Чехия http://slava-semushin.blogspot.com
Дата: 19.05.08 06:11
Оценка:
Здравствуйте, DukeNukem3D, Вы писали:

DND> void Set()

DND> {
DND> cout << "Enter Name of the employeer" << endl;
DND> getline(cin, sName, '\n');
DND> }
DND>};

Попробуйте заменить getline(cin, sName, '\n'); на getline(cin, sName); и подключить хедер string

DND> do

DND> {

Вы, видимо, код не правильно/не весь привели, потому что у вас тут есть do и нигде нет while() закрывающего.
Re[2]: getline() чудит
От: DukeNukem3D Россия  
Дата: 19.05.08 06:38
Оценка:
Здравствуйте, php-coder, Вы писали:

PC>Здравствуйте, DukeNukem3D, Вы писали:


DND>> void Set()

DND>> {
DND>> cout << "Enter Name of the employeer" << endl;
DND>> getline(cin, sName, '\n');
DND>> }
DND>>};

PC>Попробуйте заменить getline(cin, sName, '\n'); на getline(cin, sName); и подключить хедер string


Заменил, но не помогло — ведет себя точно также.

DND>> do

DND>> {

PC>Вы, видимо, код не правильно/не весь привели, потому что у вас тут есть do и нигде нет while() закрывающего.


да, прошу прощения, вот весь код


#include <iostream>    //cin, cout
#include <string>    //standard c++ clacc
#include <iomanip>    //setw

using namespace std;

lass clsEmployee
{
    private:

        string sName;
        unsigned int uiEmployeeID;
        static unsigned int uiEmpCounter;

    public:

        clsEmployee()
        {
            uiEmpCounter++;
            uiEmployeeID = uiEmpCounter;
        }

        void Print()
        {
            cout << "Name " << setw(40) << sName << " ID " << uiEmployeeID << endl;
        }

        void Set()
        {
            cout << "Enter Name of the employeer" << endl;
            getline(cin, sName);
        }
};

unsigned int clsEmployee::uiEmpCounter;

int main()
{
    short siCounter = 0;
    clsEmployee Employee[10];
    string strEmpName;
    char cCheck;

    do
    {
        cCheck = 'n';
        Employee[siCounter].Set();
        if (siCounter == 9)
        {
            cout << "Enough!" << endl;
            break;
        }
        else
        {
            cout << "Wanna enter more? (y/n) >";
            cin >> cCheck;
        }
        siCounter++;
    }
    while (cCheck != 'n');

    for ( int i = 0; i < siCounter; i++)
    {
        Employee[i].Print();
    }

    return 0;
}
С уважением, Андрей
Re: getline() чудит
От: Were  
Дата: 19.05.08 07:02
Оценка:
Здравствуйте, DukeNukem3D, Вы писали:

DND>Делаю так:


DND>я как-то неправильно getline использую?


Вы неправильно вводите данные, надо так:


Enter Name of the employeer
a
Wanna enter more? (y/n) >y
Enter Name of the employeer
b
Wanna enter more? (y/n) >y
Enter Name of the employeer
c


И так далее, так как первый раз данные считывает cin >> cCheck;, а затем уже getline(cin, sName, '\n');
Re: getline() чудит
От: Кодт Россия  
Дата: 19.05.08 08:11
Оценка:
Здравствуйте, DukeNukem3D, Вы писали:

DND>я как-то неправильно getline использую?


Нет, ты неправильно используешь чтение y/n.
Дело в том, что
cout >> "yes or no? ";
cin << c;
getline(cin, s, '\n');

Отрабатывает следующим образом:
1) выводится просьба
2) cin<<c передаёт управление консоли
3) консоль ожидает завершения ввода (для неё это символы LF или EOF)
4) ты вводишь 'Y' и LF (чтобы завершить ожидание)
5) консоль возвращает управление
6) cin<<c читает первый символ ('Y'), в буфере остаётся LF
7) getline() читает строку до LF включительно — что, собственно, ты и наблюдаешь.

Необходимо после чтения однобуквенного ответа очищать буфер до конца строки.
... << RSDN@Home 1.2.0 alpha rev. 655>>
Перекуём баги на фичи!
Re[2]: getline() чудит
От: DukeNukem3D Россия  
Дата: 19.05.08 09:03
Оценка:
Здравствуйте, Were, Вы писали:

W>Вы неправильно вводите данные, надо так:



W>
W>Enter Name of the employeer
W>a
W>Wanna enter more? (y/n) >y
W>Enter Name of the employeer
W>b
W>Wanna enter more? (y/n) >y
W>Enter Name of the employeer
W>c
W>


W>И так далее, так как первый раз данные считывает cin >> cCheck;, а затем уже getline(cin, sName, '\n');


Я сделал так:


cout << "Wanna enter more? (y/n) >";
cin >> cCheck;
cout << "Enter Name of the employeer" << endl;
getline(cin, sName, '\n');



Но оно также продолжает чудить:


Enter Name of the employeer
a
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >


я вот думаю — а может просто виндовая консоль и линуксовая отличаются? я в линуксе пишу сейчас
С уважением, Андрей
Re[2]: getline() чудит
От: DukeNukem3D Россия  
Дата: 19.05.08 09:04
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Нет, ты неправильно используешь чтение y/n.

К>Дело в том, что
К>
К>cout >> "yes or no? ";
К>cin << c;
К>getline(cin, s, '\n');
К>

К>Отрабатывает следующим образом:
К>1) выводится просьба
К>2) cin<<c передаёт управление консоли
К>3) консоль ожидает завершения ввода (для неё это символы LF или EOF)
К>4) ты вводишь 'Y' и LF (чтобы завершить ожидание)
К>5) консоль возвращает управление
К>6) cin<<c читает первый символ ('Y'), в буфере остаётся LF
К>7) getline() читает строку до LF включительно — что, собственно, ты и наблюдаешь.

К>Необходимо после чтения однобуквенного ответа очищать буфер до конца строки.


Хорошо, а как очистить буфер?
С уважением, Андрей
Re[3]: getline() чудит
От: DukeNukem3D Россия  
Дата: 19.05.08 10:27
Оценка:
Здравствуйте, DukeNukem3D, Вы писали:

DND>Здравствуйте, Кодт, Вы писали:


К>>Нет, ты неправильно используешь чтение y/n.

К>>Дело в том, что
К>>
К>>cout >> "yes or no? ";
К>>cin << c;
К>>getline(cin, s, '\n');
К>>

К>>Отрабатывает следующим образом:
К>>1) выводится просьба
К>>2) cin<<c передаёт управление консоли
К>>3) консоль ожидает завершения ввода (для неё это символы LF или EOF)
К>>4) ты вводишь 'Y' и LF (чтобы завершить ожидание)
К>>5) консоль возвращает управление
К>>6) cin<<c читает первый символ ('Y'), в буфере остаётся LF
К>>7) getline() читает строку до LF включительно — что, собственно, ты и наблюдаешь.

К>>Необходимо после чтения однобуквенного ответа очищать буфер до конца строки.


DND>Хорошо, а как очистить буфер?


Порылся в доках, сделал так:

cout << "Enter Name of the employeer" << endl;
getline(cin, sName);
cout << "Wanna enter more? (y/n) >";
cin >> cCheck;
cin.sync();

ведет себя также:


Enter Name of the employeer
a
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >y
Enter Name of the employeer
Wanna enter more? (y/n) >n
Name                                        a ID 1
Name                                          ID 2
Name                                          ID 3
С уважением, Андрей
Re[4]: getline() чудит
От: lkss  
Дата: 19.05.08 12:25
Оценка: 2 (1)
Здравствуйте, DukeNukem3D, Вы писали:

DND>cout << "Enter Name of the employeer" << endl;

DND>getline(cin, sName);
DND>cout << "Wanna enter more? (y/n) >";
DND>cin >> cCheck;
DND>cin.sync();

можно попробовать использовать cin.ignore()


cout << "Wanna enter more? (y/n) >";
cin >> cCheck;
cin.ignore();
Re[5]: getline() чудит
От: DukeNukem3D Россия  
Дата: 20.05.08 08:01
Оценка:
Здравствуйте, lkss, Вы писали:

L>Здравствуйте, DukeNukem3D, Вы писали:


DND>>cout << "Enter Name of the employeer" << endl;

DND>>getline(cin, sName);
DND>>cout << "Wanna enter more? (y/n) >";
DND>>cin >> cCheck;
DND>>cin.sync();

L>можно попробовать использовать cin.ignore()



L>
L>cout << "Wanna enter more? (y/n) >";
L>cin >> cCheck;
L>cin.ignore();

L>


Да, это действительно помогло!
С уважением, Андрей
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.