Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
#1

Не работает getline(); - C++

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

Всем доброго дня

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

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', не помогло, то же самое...
Что делать?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2012, 16:07     Не работает getline();
Посмотрите здесь:

Не работает getline! - C++
Почему-то, когда ввожу строку с помощью cin.getline, всё равно строка записывается до первого пробела :( #include &lt;conio.h&gt;; #include...

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

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

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

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

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
29.03.2012, 16:19     Не работает getline(); #2
я не вижу тут выполнения, это просто класс
-=ЮрА=-
Заблокирован
Автор FAQ
29.03.2012, 16:41     Не работает getline(); #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;
* * * * }
};
Попробуй код с красными строками, но лучше приведи код целиком, по обрывку сложно что либо сказать
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 16:43  [ТС]     Не работает getline(); #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;
}
-=ЮрА=-
Заблокирован
Автор FAQ
29.03.2012, 16:52     Не работает getline(); #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;
}
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 16:52  [ТС]     Не работает getline(); #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение

Не по теме:

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

Это не составит труда, затык сейчас не в этом..
-=ЮрА=-
Заблокирован
Автор FAQ
29.03.2012, 16:57     Не работает getline(); #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();  
-=ЮрА=-
Заблокирован
Автор FAQ
29.03.2012, 16:59     Не работает getline(); #8
Только увидел что уже взял код в работу, тогда ок...
Как я понял всё сводилось к синхронизации
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
cin.sync();
* * * * * * * * getline(cin, name);
странновато конечно, но как видем без него не работает
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 17:07  [ТС]     Не работает getline(); #9
Все заработало так как должно было после того как я добавил строку
C++
1
cin.sync();
. Надо погуглить что это такой за
C++
1
.sync()
в книге его не было.

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

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

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

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

Тем не менее, вопрос с gelline(); остался открытым... это должно работать без .sync(); иначе зачем он тогда вообще нужен без встроенной синхронизации потоков?
-=ЮрА=-
Заблокирован
Автор FAQ
29.03.2012, 17:56     Не работает getline(); #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/reference/i.../istream/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.
daite_dve
0 / 0 / 0
Регистрация: 06.02.2012
Сообщений: 37
29.03.2012, 22:21  [ТС]     Не работает getline(); #13
да, мне кажется что тут дело именно в том что getline вызывается из метода, а не из main (ну или другой обычной функции)... где-то тут собака зарыта... из main ничего синкать не надо. Однакож в задании попросили написать метод который присвоит значения полям, а sync в книге (Лафоре) не упоминался, а задания там все четко по тому что написано..

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

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

Цитата Сообщение от daite_dve Посмотреть сообщение
мне такие вещи разжовывать надо
- если хочешь чему то научиться пробуй искать ответы на подобные вопросы и сам
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2012, 14:29     Не работает getline();
Еще ссылки по теме:

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

Не работает getline() в классе - C++
Почему-то, если поставить char name; ... cin&gt;&gt;name;, то имя вводится, а если использовать string name; ... getline(cin, name); то операция...

Не работает getline в VS2012 - C++
От код на линуксе все отлично а от в визуалке проблемы #include &lt;fstream&gt; #include &lt;cstring&gt; #include &lt;iostream&gt; using namespace...

Не работает getline в VS2010 - C++
Исходник: #include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; int main(){ string buf, to_find =...

Почему getline не работает? - C++
Вот код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;locale&gt; #include &lt;string&gt; #include &lt;sstream&gt; #include &lt;math.h&gt; ...


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

Или воспользуйтесь поиском по форуму:
kazak
3034 / 2355 / 155
Регистрация: 11.03.2009
Сообщений: 5,401
30.03.2012, 14:29     Не работает getline(); #15
Цитата Сообщение от daite_dve Посмотреть сообщение
итого, зачем getline() без sync пока неясно...
Метод sync нужен для сброса буфера ввода, если в буфер остались какие-либо данные после выполнения предыдущех операций взятия из потока, когда для текущей операции требуется получение данных именно с клавиатуры (в частности).

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru