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

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

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

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

06.12.2011, 09:55. Просмотров 5458. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
06.12.2011, 09:55     cin.getline работает через раз
Посмотрите здесь:

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

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

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

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;

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
n00b.vcxproj
Кодер
47 / 46 / 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
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.12.2011, 11:35     cin.getline работает через раз #3
GBIT, дело, скорее всего в буферизации. Хотя вы не написали КАК не работает getline, но думаю, дело было так:
Ввод переменной var целого типа заканчивается, когда вы нажимаете enter. Этот enter остается в буфере, и его кушает getline. А у нее по умолчанию enter тоже означает окончание ввода - вот и приплыли.
Надо после ввода целого буфер почистить. Способов много - например, введите один символ с помощью get
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
Эксперт С++
1035 / 814 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
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 при считывании строки большей буфера - C++
Доброго всем времени суток!:) Проблема состоит в том, что если ввести 4 и более символов cin.getline(boofer, 3); перестаёт работать. Как я...

Getline() и cin - C++
Проблема заключается в том, что после ввода через cin , getline() не работает, точнее работает, но непонятно для меня. Я так предполагаю,...

cin.getline() - C++
Помагите пожалуйсто.Ввести предложение. Вывести так, чтобы в каждой строке было написано одно слово предложения после пробела.с++ 2006...

cin И getline - C++
#include &lt;iostream&gt; int main() { using namespace std; char n1; int n2;

cin.getline - C++
Здравствуйте. Есть вот программа: #include &lt;iostream&gt; // #include &lt;cmath&gt; // #include &lt;conio.h&gt; // //...


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

Или воспользуйтесь поиском по форуму:
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 работает через раз
Ответ Создать тему
Опции темы

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