Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> getline в цикле выполняется только один раз 
V
    Опции темы
jurgal
Дата 28.12.2007, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Код

#include "stdafx.h"
#include <iostream>
#include <string>
using namespace std;

class employee
{
    string name;
    long number;
public:
    void getdata();
    void putdata() const;
};
void employee::getdata()
{
    cout << "Input name of worker: ";
    getline(cin,name);
    cout << endl << "Input number of worker: ";
    cin >> number;
}
void employee::putdata() const
{
    cout << "Name: " << name << endl;
    cout << "Number: " << number << endl;
}


int _tmain(int argc, _TCHAR* argv[])
{
    
    employee arr[5];
    for(int i=0;i<5;i++)
        arr[i].getdata();
    for(int i=0;i<5;i++)
    {
        arr[i].putdata();
        cout << endl;
    }

    return 0;
}


в первом цикле при вводе информации, getline(cin,name) из метода getdata() выолняется только в первый раз, а в последующих итерациях пропускает его и сразу же предлагает ввести номер(cin >> number;). Если использовать вместо getline(cin,name) просто cin >> name , то все в порядке. В чем ошибка?
PM MAIL   Вверх
zkv
Дата 28.12.2007, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: нет
Всего: 92



Код

void employee::getdata()
{
    cout << "Input name of worker: ";
    getline(cin,name);
    _flushall();
    cout << endl << "Input number of worker: ";
    cin >> number;
}

так работает?
PM MAIL   Вверх
papam
Дата 28.12.2007, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 2.2.2006
Где: Украина::Запорожь е

Репутация: 2
Всего: 4



Работает:
Код


#include "stdafx"
#include <iostream.h>
#include <string.h>
 using namespace std;
class employee
{
    string name, number;
public:
    void getdata();
    void putdata() const;
};
void employee::getdata()
{
    cout << "Input name of worker: ";
    getline(cin,name);
    cout << endl << "Input number of worker: ";
    //cin >> number;
    getline(cin,name);  // <-----------------------------
}
void employee::putdata() const
{
    cout << "Name: " << name << endl;
    cout << "Number: " << number << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
    
    employee arr[5];
    for(int i=0;i<5;i++)
        arr[i].getdata();
    for(int i=0;i<5;i++)
    {
        arr[i].putdata();
        cout << endl;
    }
    return 0;
}


Это сообщение отредактировал(а) papam - 28.12.2007, 01:13
--------------------
No Fucking Future
PM MAIL ICQ   Вверх
jurgal
Дата 28.12.2007, 01:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Цитата(papam @  28.12.2007,  00:53 Найти цитируемый пост)
#include "stdafx"
void employee::getdata()
{
    cout << "Input name of worker: ";
    getline(cin,name);
    cout << endl << "Input number of worker: ";
    //cin >> number;
    getline(cin,number);  // <-----------------------------
}


так работает, спасибо =)



papam

но почему не получается одновременно использовать cin и getline? Ведь приходится для номера использовать string, а не long int


Цитата(zkv @  28.12.2007,  00:46 Найти цитируемый пост)
void employee::getdata()
{
    cout << "Input name of worker: ";
    getline(cin,name);
    _flushall();
    cout << endl << "Input number of worker: ";
    cin >> number;
}

так не работает, но за flushall(); спасибо =) , новое узнал.

Это сообщение отредактировал(а) jurgal - 29.12.2007, 00:30
PM MAIL   Вверх
papam
Дата 28.12.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 2.2.2006
Где: Украина::Запорожь е

Репутация: 2
Всего: 4



operator>> не извлекает разделители из потока, идущие после вводимой последовательности. Т.е. последовательность операций: getline(cin, name);cin >> number;  всегда будет возвращать пустую строку, если после ввода числа был нажат энтер.
А номер можно вводить и строкой.

Это сообщение отредактировал(а) papam - 28.12.2007, 11:08
--------------------
No Fucking Future
PM MAIL ICQ   Вверх
bsa
Дата 28.12.2007, 13:18 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



papam, может наоборот getline() читает пустую строку после operator>>()?
чтобы этого не было, нужно сделать так:
Код
cin >> number >> ws; //ws - это от слова whitespace - извлекает все разделители из потока

PM   Вверх
papam
Дата 28.12.2007, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 104
Регистрация: 2.2.2006
Где: Украина::Запорожь е

Репутация: 2
Всего: 4



Ошибся с формулировкой!!!
--------------------
No Fucking Future
PM MAIL ICQ   Вверх
jurgal
Дата 28.12.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Цитата(bsa @  28.12.2007,  13:18 Найти цитируемый пост)
cin >> number >> ws; //ws - это от слова whitespace - извлекает все разделители из потока

а так он после ввода номера и enter'a ждет ещё один ввод и \r, затем перепрыгивает ввод строки и снова ждет ввода номера(cin >> number >> ws; )
PM MAIL   Вверх
bsa
Дата 28.12.2007, 18:15 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Цитата(jurgal @ 28.12.2007,  17:41)
Цитата(bsa @  28.12.2007,  13:18 Найти цитируемый пост)
cin >> number >> ws; //ws - это от слова whitespace - извлекает все разделители из потока

а так он после ввода номера и enter'a ждет ещё один ввод и \r, затем перепрыгивает ввод строки и снова ждет ввода номера(cin >> number >> ws; )

проверил. действительно глючит.
убери >> ws; и поставь внутрь getline(cin, ...): 
Код
getline(cin >> ws, name);

PM   Вверх
archimed7592
Дата 28.12.2007, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93




 ! 
archimed7592
jurgal, постарайся в будщем воздерживаться от оверквотинга.



--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
jurgal
Дата 29.12.2007, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 38
Регистрация: 29.6.2007

Репутация: нет
Всего: нет



Цитата(bsa @  28.12.2007,  18:15 Найти цитируемый пост)
getline(cin >> ws, name);

так работает =) огромное спасибо. Получается разделители убираются перед вводом name, сначала новой итерации?

Добавлено через 1 минуту и 27 секунд
Цитата(archimed7592 @  28.12.2007,  21:53 Найти цитируемый пост)
jurgal, постарайся в будщем воздерживаться от оверквотинга.

прошу прощения, исправлюсь =)
PM MAIL   Вверх
archimed7592
Дата 29.12.2007, 12:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 6
Всего: 93



Цитата(jurgal @  29.12.2007,  00:27 Найти цитируемый пост)
Получается разделители убираются перед вводом name, сначала новой итерации?

Да.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0929 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.