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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 40, средняя оценка - 4.80
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
06.12.2011, 09:55     cin.getline работает через раз #1
вот этот код работает прекрасно
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;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
n00b.vcxproj
Кодер
 Аватар для n00b.vcxproj
46 / 45 / 2
Регистрация: 10.10.2010
Сообщений: 229
06.12.2011, 11:27     cin.getline работает через раз #2
на самом деле он срабатывает, когда вы начинаете вводить
Цитата Сообщение от GBIT Посмотреть сообщение
cin>>var;
то
cin.getline(directory, sizeof(directory));
как бы "сразу" просит подачки.
если вы напишете через пробел, то cin.getline возьмёт его.
выход есть, вместо getline поставьте
C++
1
scanf("%s", directory);
правда брать он будет только до первого пробела или eof символа.
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
06.12.2011, 11:35     cin.getline работает через раз #3
GBIT, дело, скорее всего в буферизации. Хотя вы не написали КАК не работает getline, но думаю, дело было так:
Ввод переменной var целого типа заканчивается, когда вы нажимаете enter. Этот enter остается в буфере, и его кушает getline. А у нее по умолчанию enter тоже означает окончание ввода - вот и приплыли.
Надо после ввода целого буфер почистить. Способов много - например, введите один символ с помощью get
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
06.12.2011, 14:08  [ТС]     cin.getline работает через раз #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 Посмотреть сообщение
Надо после ввода целого буфер почистить.
хохо) я даже не понимаю как и что это)
можно еще один вариант как почистить буфер?)
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
06.12.2011, 14:17     cin.getline работает через раз #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().
CheToZudit
9 / 9 / 2
Регистрация: 22.10.2011
Сообщений: 19
06.12.2011, 15:30     cin.getline работает через раз #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;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.12.2011, 16:32     cin.getline работает через раз
Еще ссылки по теме:

Не работает cin.getline(buf, 20); C++
Не работает. cin.getline(string,200); C++
Cin.getline() не работает при динамическом выделении памяти C++

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

Или воспользуйтесь поиском по форуму:
GBIT
 Аватар для GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
06.12.2011, 16:32  [ТС]     cin.getline работает через раз #7
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
моей книги по С++.ООП.
подобрал с пола челюсть. вот уж не думал что таких серьезных людей тут можно встретить.
спасибо за пояснения.
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Посмотрите еще метод ignore().
то что доктор прописал.
Yandex
Объявления
06.12.2011, 16:32     cin.getline работает через раз
Ответ Создать тему
Опции темы

Текущее время: 21:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru