Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/89: Рейтинг темы: голосов - 89, средняя оценка - 4.70
0 / 0 / 2
Регистрация: 06.02.2012
Сообщений: 37
1

Не работает getline();

29.03.2012, 16:07. Показов 16783. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем доброго дня

Не работает кусочек кода:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Employee
{
private:
 
    string name;
    int number;
 
public:
void setData()
    {
        cout << "Input name: ";
        getline(cin, name);
        cout << "Input number: ";
        cin >> number;
    }
};
При выполнении программы строка с getline() просто пропускается... Пробовал ставить третий агрумент как символ окончания ввода '\n', не помогло, то же самое...
Что делать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.03.2012, 16:07
Ответы с готовыми решениями:

Не работает getline()
Здравствуйте, есть такой код: bool Library::AddNewBook() { bool repeat = true; char answer;...

не работает getline
Подскажите, пожалуйста, почему не работает getline? Нужно ввести порядковый номер служащего и его...

Не работает getline
Есть прога, которая считает предложения и выводит самое длинное.Есть главный кейс с меню. В первом...

Не работает getline()
У меня есть класс, в котором в функции printPaste считывается строка пользователем. При вызове этой...

15
601 / 569 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
29.03.2012, 16:19 2
я не вижу тут выполнения, это просто класс
0
Заблокирован
Автор FAQ
29.03.2012, 16:41 3
Цитата Сообщение от daite_dve Посмотреть сообщение
При выполнении программы строка с getline() просто пропускается... Пробовал ставить третий агрумент как символ окончания ввода '\n', не помогло, то же самое...
Что делать?
- всё должно работать, предположу что у тебя либо множественный ввод , тогда \n оставшееся от предыдущего ввода "портит нам жизнь" либо можно попробовать синхронизировать поток ввода

Цитата Сообщение от daite_dve Посмотреть сообщение
void setData()
* * * * {
* * * * * * * * cout << "Input name: ";
cin.sync();
* * * * * * * * getline(cin, name);
cin.ignore();
* * * * * * * * cout << "Input number: ";
* * * * * * * * cin >> number;
* * * * }
};
Попробуй код с красными строками, но лучше приведи код целиком, по обрывку сложно что либо сказать
1
0 / 0 / 2
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 16:43  [ТС] 4
Я изучаю С++ по книге, там синхронизации еще не было, так что надо как-нибудь без нее я думаю
Задача написать программу которая будет принимать до 100 значений имен и номеров работников:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <iostream>
#include <string>
using namespace std;
 
class Employee
{
private:
 
    string name;
    int number;
 
public:
 
    void setData()
    {
        cout << "Input name: ";
        getline(cin, name);
        cout << "\nInput number: ";
        cin >> number;
    }
 
    void showData()
    {
        cout << name << " " << number << endl;
    }
 
};
 
int main()
{
    Employee employee [ 100 ];
    int value;
    cout << "Input number of employees you'd like to enter (till 100): ";
    cin >> value;
    while (value > 100 || value <= 0)
    {
        cout << "Value is out of range, try one more time: ";
        cin >> value;
    }
    
    int i = 0;
    while (i < value)
    {
        employee[i].setData();
        i++;
    }
    i = 0;
    while (i < value)
    {
        employee[i].showData();
        i++;
    }
    system("pause");
    return 0;
}
0
Заблокирован
Автор FAQ
29.03.2012, 16:52 5

Не по теме:

daite_dve, где конструктор класса???Сейчас подправлю...



Добавлено через 5 минут
daite_dve, вот подправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <string>
using namespace std;
 
class Employee
{
private:
    string name;
    int number;
public:
    Employee()
    {
        name = "";
        number = 0;
    }
    void setData()
    {
        cout <<"Input name: ";
        cin.sync();
        getline(cin, name);
        cout<<"Input number: ";
        cin>>number;
    }
    void showData()
    {
        cout << name << " " << number << endl;
    }
};
 
int main()
{
    int i, N = -1;
    Employee * list = NULL;
    while (N < 1 || 100 < N)
    {
        cout << "Input number of employees (1 - 100): ";
        if(!(cin >> N))
            cout<<"Input error\n";
    }
    if(!(list = new Employee[N]))
        cout<<"Allocation memory error\n";
    else
    {
        for(i = 0; i < N; i++)
            list[i].setData();
        for(i = 0; i < N; i++)
            list[i].showData();
    }
    system("pause");
    return 0;
}
2
0 / 0 / 2
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 16:52  [ТС] 6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

daite_dve, где конструктор класса???Сейчас подправлю...

Это не составит труда, затык сейчас не в этом..
0
Заблокирован
Автор FAQ
29.03.2012, 16:57 7
daite_dve, смотри код выше, как это не надо конструктор
Вот ещё раз тело класса
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Employee
{
private:
    string name;
    int number;
public:
    Employee()
    {
        name = "";
        number = 0;
    }
    void setData()
    {
        cout <<"Input name: ";
        cin.sync();
        getline(cin, name);
        cout<<"Input number: ";
        cin>>number;
    }
    void showData()
    {
        cout << name << " " << number << endl;
    }
};
У меня 6-ка поэтому на вводе приходится Enter жать 2 раза а так всё норм стало
Миниатюры
Не работает getline();  
0
Заблокирован
Автор FAQ
29.03.2012, 16:59 8
Только увидел что уже взял код в работу, тогда ок...
Как я понял всё сводилось к синхронизации
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.sync();
* * * * * * * * getline(cin, name);
странновато конечно, но как видем без него не работает
1
0 / 0 / 2
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 17:07  [ТС] 9
Все заработало так как должно было после того как я добавил строку
C++
1
cin.sync();
. Надо погуглить что это такой за
C++
1
.sync()
в книге его не было.

А конструктор обязательно использовать? Без него все итак прекрасно заработало.

P.S.: Я не стал переделывать полностью весь код, т.к. то что там у тебя Юр написано я даже не понимаю Мал я еще.

Добавлено через 2 минуты
да, странно что без
C++
1
.sync();
не работает... может кто еще зайдет в эту тему, да вразумит почему..

Добавлено через 3 минуты
кстати, читал правила хорошего тона в программировании, там
C++
1
while
везде рекомендуют использовать
0
Заблокирован
Автор FAQ
29.03.2012, 17:08 10
Цитата Сообщение от daite_dve Посмотреть сообщение
А конструктор обязательно использовать?
- в принципе можно конечно и без него, но тогда при объявлении переменной класса, его внутренние переменные будут без начальной инициализации, это может повлечь за собой печальные последствия
Посмотри сюда по поводу конструктора
http://ru.wikipedia.org/wiki/К... мирование)
http://programmersclub.ru/23/
1
0 / 0 / 2
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 17:28  [ТС] 11
да, в серьезных программах лучше конструктор использовать, а то какой-нибудь параметр примет значение -стопятьсот, и все...

Тем не менее, вопрос с gelline(); остался открытым... это должно работать без .sync(); иначе зачем он тогда вообще нужен без встроенной синхронизации потоков?
0
Заблокирован
Автор FAQ
29.03.2012, 17:56 12
Цитата Сообщение от daite_dve Посмотреть сообщение
иначе зачем он тогда вообще нужен без встроенной синхронизации потоков?
- метод класса несколько отличен от вызова функции из основного модуля, поэтому нам и нужна синхронизация потока ввода, как вариант возможно стоит попробовать cin.sync() вписать в тело конструктора, даже самому интресно стало

Добавлено через 2 минуты
daite_dve, я уже проверил и такая конструкция не позволяет вводить данные корректно
C++
1
2
3
4
5
6
Employee()
    {
        name = "";
        number = 0;
        cin.sync();
    }
синхронизировать надо, сейчас помозгую почему...

Добавлено через 5 минут
daite_dve, смотри http://www.cplusplus.com/refer... ream/sync/
Synchronize input buffer with source of characters
Synchronizes the buffer associated with the stream to its controlled input sequence. This effectively means that the unread characters in the buffer are discarded.

The function only has meaning for buffered streams, in which case it effectively calls the pubsync member of the streambuf object (rdbuf()->pubsync()) associated to the input sequence.
0
0 / 0 / 2
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 22:21  [ТС] 13
да, мне кажется что тут дело именно в том что getline вызывается из метода, а не из main (ну или другой обычной функции)... где-то тут собака зарыта... из main ничего синкать не надо. Однакож в задании попросили написать метод который присвоит значения полям, а sync в книге (Лафоре) не упоминался, а задания там все четко по тому что написано..

Добавлено через 5 минут
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
честно говоря мне еще сложно такие вещи читать, ничего не понимаю, ни потоки, ни :: мне такие вещи разжовывать надо

Добавлено через 4 часа 19 минут
итого, зачем getline() без sync пока неясно...
0
Заблокирован
Автор FAQ
30.03.2012, 09:51 14
Цитата Сообщение от daite_dve Посмотреть сообщение
итого, зачем getline() без sync пока неясно...
Ну как не яснопри запуске main уже создаётся буферезированный синхронный поток ввода, а при вводе в методе класса мы организуем доп поток, которой буферезирован но работает несинхронно с main вот поэтому и нужна синхронизация.
:: операция расширения видимости прочитай здесь что это и с чем едят http://darkraha.com/rus/cpp/cpp04.php

Цитата Сообщение от daite_dve Посмотреть сообщение
мне такие вещи разжовывать надо
- если хочешь чему то научиться пробуй искать ответы на подобные вопросы и сам
2
3528 / 2686 / 334
Регистрация: 11.03.2009
Сообщений: 6,168
30.03.2012, 14:29 15
Цитата Сообщение от daite_dve Посмотреть сообщение
итого, зачем getline() без sync пока неясно...
Метод sync нужен для сброса буфера ввода, если в буфер остались какие-либо данные после выполнения предыдущех операций взятия из потока, когда для текущей операции требуется получение данных именно с клавиатуры (в частности).

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Ну как не яснопри запуске main уже создаётся буферезированный синхронный поток ввода, а при вводе в методе класса мы организуем доп поток, которой буферезирован но работает несинхронно с main вот поэтому и нужна синхронизация.
Охинея какая-то.
0
-=ЮрА=-
30.03.2012, 15:22     Не работает getline();
  #16

Не по теме:

Цитата Сообщение от kazak Посмотреть сообщение
Ахинея какая-то. - тут А надо
PS:не буду я ругаться, всё подвязал с этим :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.03.2012, 15:22

Не работает getline()
Это часть из моего курсового, почему-то когда я запрашиваю заполнение структуры, то на то, что...

Не работает getline!
Почему-то, когда ввожу строку с помощью cin.getline, всё равно строка записывается до первого...

Не работает getline
Привет всем! непонимаю почему не работает getline. вот код #include &lt;training.h&gt; #include...

не работает getline
Есть код (писал не я), но не могу понять, почему getline() игнорируется в строке 72. Сначала не...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru