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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.80
GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
#1

cin.getline работает через раз - C++

06.12.2011, 09:55. Просмотров 5799. Ответов 6
Метки нет (Все метки)

вот этот код работает прекрасно
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
void Open_Directory()
{
    char *directory= new char[1000];
    cin.getline(directory, sizeof(directory));
    //cin.getline(directory, sizeof(directory));
    cout<<directory<<"\n";
}
int main()
{
    /*int var;
    cin>>var;*/
    Open_Directory();
    
    return 0;
}
дописываем переменную var и cin.getline уже не срабатывает(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
void Open_Directory()
{
    char *directory= new char[1000];
    cin.getline(directory, sizeof(directory));
    //cin.getline(directory, sizeof(directory));                   // разве что еще один писать. но это маразм. знаю что должен и один работать
    cout<<directory<<"\n";
}
int main()
{
    int var;
    cin>>var;
    Open_Directory();
    
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2011, 09:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос cin.getline работает через раз (C++):

Не работает ни cin.Get(), ни cin.Getline() - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &quot;conio.h&quot; #include &quot;windows.h&quot; #include &quot;string.h&quot; using namespace::std; const...

Не работает cin.getline(buf, 20); - C++
Товарищи подскажите почему не работает cin.getline(buf, 20);? Проблема в том что я хочу ограничить ввод до 20 символов но оно не...

Не работает getline(cin,s), istream.ignore() - C++
Использую microsoft visual c++ 6.0. не работает: string s; getline(cin,s);//дважды приходиться жать ентер При использовании...

Не работает. cin.getline(string,200); - C++
Я создаю проект. Все работает кроме одного cin.getline(string,200), почему? Когда запускаю этот Task3 в отдельном проекте все есть, но...

cin.getline переброс через строку - C++
Использую функцию cin.getline,но происходит вот такое чуДооО см картинку внизу Код char *Names = new char; char...

Заполнение структуры через cin.getline - C++
struct data { int day; int month; int year; }; struct NOTE { char familia; char name;

6
n00b.vcxproj
Кодер
47 / 46 / 2
Регистрация: 10.10.2010
Сообщений: 229
06.12.2011, 11:27 #2
на самом деле он срабатывает, когда вы начинаете вводить
Цитата Сообщение от GBIT Посмотреть сообщение
cin>>var;
то
cin.getline(directory, sizeof(directory));
как бы "сразу" просит подачки.
если вы напишете через пробел, то cin.getline возьмёт его.
выход есть, вместо getline поставьте
C++
1
scanf("%s", directory);
правда брать он будет только до первого пробела или eof символа.
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.12.2011, 11:35 #3
GBIT, дело, скорее всего в буферизации. Хотя вы не написали КАК не работает getline, но думаю, дело было так:
Ввод переменной var целого типа заканчивается, когда вы нажимаете enter. Этот enter остается в буфере, и его кушает getline. А у нее по умолчанию enter тоже означает окончание ввода - вот и приплыли.
Надо после ввода целого буфер почистить. Способов много - например, введите один символ с помощью get
2
GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
06.12.2011, 14:08  [ТС] #4
не знаю. но получается в моем первом варианте
C++
1
cout<<directory<<"\n";
должен был вернуть содержимое var что ли?
C++
1
2
3
сin>>var;                      // подаю в него допустим "123"
cin.getline(directory, sizeof(directory));     // допустим скушал 123
cout<<directory<<"\n";      // по идее должен вернуть 123. но он выводит ничего
отладчик выдает что после строчки cin.getline directory содержит 0.
хотелось бы обойтись без scanf и тот факт что
Цитата Сообщение от n00b.vcxproj Посмотреть сообщение
правда брать он будет только до первого пробела или eof символа.
это очень очень плохо. мне нужно чтобы с пробелами
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
введите один символ с помощью get
это лишний ввод. нужно чтобы все само работало)
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Надо после ввода целого буфер почистить.
хохо) я даже не понимаю как и что это)
можно еще один вариант как почистить буфер?)
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.12.2011, 14:17 #5
Цитата Сообщение от GBIT Посмотреть сообщение
не знаю. но получается в моем первом варианте
C++
1
cout<<directory<<"\n";
должен был вернуть содержимое var.
C++
1
2
3
сin>>var;                      // подаю в него допустим "123"
cin.getline(directory, sizeof(directory));     // допустим скушал 123
cout<<directory<<"\n";      // по идее должен вернуть 123. но он выводит ничего
отладчик выдает что после строчки cin.getline directory содержит 0.
хотелось бы обойтись без scanf
1. Внимательно прочитайте какую-нить книжку по С++ о вводе выводе. Минимально - 14 главу из моей книги по С++.ООП. Тут на форуме я кое-что постил из нее - поищите мои сообщения.
2. Мыслите вы неправильно. Мы имеем дело с ПОТОКОМ символов. Символы, которые УЖЕ прочитаны, можно ВЕРНУТЬ в поток. Если не возвращать, то их уже нет, повторно их прочитать невозможно.
Поэтому:
cin >> var; скушал 123 - из буфера ввода эти символы удалены. А в буфере осталось enter - символ, который является окончанием ввода целого.
Далее начинает getline и он видит тот самый enter (никаких 123 уже нет - они уже "отыграны" предыдущим вводом). И заканчивает работу, совершенно справедливо полагая ноль в качестве длины строки.
3. Enter по-любому надо "отыграть" - например, проигнорировать. Посмотрите еще метод ignore().
1
CheToZudit
9 / 9 / 2
Регистрация: 22.10.2011
Сообщений: 19
06.12.2011, 15:30 #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
using namespace std;
void Open_Directory()
{
        char *directory= new char[1000];
        cin.getline(directory, sizeof(directory));
        //cin.getline(directory, sizeof(directory));                   // разве что еще один писать. но это маразм. знаю что должен и один работать
        cout<<directory<<"\n";
}
int main()
{
        int var;
        cin>>var;
        cin.ignore();     // !!! это должно помочь
        Open_Directory();
        return 0;
}
3
GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
06.12.2011, 16:32  [ТС] #7
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
моей книги по С++.ООП.
подобрал с пола челюсть. вот уж не думал что таких серьезных людей тут можно встретить.
спасибо за пояснения.
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Посмотрите еще метод ignore().
то что доктор прописал.
1
06.12.2011, 16:32
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2011, 16:32
Привет! Вот еще темы с ответами:

Cin.getline() не работает при динамическом выделении памяти - C++
Почему в таком коде cin.getline() работает не так как надо? Если очистить поток, то будет все нормально. #include &lt;iostream&gt; using...

При множественном наследовании не работает getline(std::cin, ?) - C++
Изучаю множественное наследование, так вот, нужно ввести два слова, но программа просто пропускает getline (std::cin, ?) Когда так при...

Не работает cin.getline при считывании строки большей буфера - C++
Доброго всем времени суток!:) Проблема состоит в том, что если ввести 4 и более символов cin.getline(boofer, 3); перестаёт работать. Как я...

Метод getline(cin, m) не срабатывает без cin.ignore() / Ревью кода - C++
Почему в моем случае getline(cin, m) не срабатывает без cin.ignore() ? Если по коду есть какие-нибудь замечания, то просьба написать что не...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

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