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

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

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

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

06.12.2011, 09:55. Просмотров 5591. Ответов 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 работает через раз (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;

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
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 символа.
ValeryLaptev
Эксперт С++
1040 / 819 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
06.12.2011, 11:35 #3
GBIT, дело, скорее всего в буферизации. Хотя вы не написали КАК не работает getline, но думаю, дело было так:
Ввод переменной var целого типа заканчивается, когда вы нажимаете enter. Этот enter остается в буфере, и его кушает getline. А у нее по умолчанию enter тоже означает окончание ввода - вот и приплыли.
Надо после ввода целого буфер почистить. Способов много - например, введите один символ с помощью get
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 Посмотреть сообщение
Надо после ввода целого буфер почистить.
хохо) я даже не понимаю как и что это)
можно еще один вариант как почистить буфер?)
ValeryLaptev
Эксперт С++
1040 / 819 / 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().
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;
}
GBIT
11 / 11 / 1
Регистрация: 05.10.2011
Сообщений: 219
06.12.2011, 16:32  [ТС] #7
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
моей книги по С++.ООП.
подобрал с пола челюсть. вот уж не думал что таких серьезных людей тут можно встретить.
спасибо за пояснения.
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
Посмотрите еще метод ignore().
то что доктор прописал.
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() ? Если по коду есть какие-нибудь замечания, то просьба написать что не...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
06.12.2011, 16:32
Ответ Создать тему
Опции темы

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