Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
prado777
2 / 2 / 1
Регистрация: 20.11.2017
Сообщений: 41
Завершенные тесты: 1
1

Для чего испоьзовать clear() перед getline()?

10.12.2017, 23:26. Просмотров 128. Ответов 2
Метки нет (Все метки)

Доброго времени суток, вопрос следующий:
Пользуюсь getline() в двух местах для считывания определенного кол-ва символов с клавы в буфер (ограничение).

В первом случае все норм (из введенных 20-ти символов, записываются только 15), но при втором вводе (Enter mask), курсор просто проскакивает эту строчку и в результате в маску не записывается ничего! Но это лишь в том случае, если мы при первом вводе (Enter IP )превысили 15 символов. Как вылечить - нашел, нужно вставить cin.clear();
cin.ignore(cin.rdbuf()->in_avail());
- для чистки буфера, но как это помогает? почему без очистки буфера он Enter MASK перескакивает? Может кто-нибудь детально объяснить?


Листинг:
1ВВОД
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void Ent_ip(char pIP[16],int oct[]){
    int j=0;
    cout<<"Enter IP-adress: ";
cin.getline(pIP,16);// protect input on 15 chars - \0
    char* p=strtok(pIP,".\0"); //
    while(p!=0){
        j=j++;
          if(j==1)
            oct[0]=atoi(p);
          if(j==2)
            oct[1]=atoi(p);
          if(j==3)
            oct[2]=atoi(p);
          else
            oct[3]=atoi(p);
            p=strtok(0,".\0");
}
    delete []pIP;//clear dinamic memory
}

2 ВВОД:
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
void Ent_msk(char pMASK[],int octm[],unsigned int *c){
    int j=0;
    cout<<"Enter Subnet Mask: ";
    [B] cin.clear();
     cin.ignore(cin.rdbuf()->in_avail());[/B]
cin.getline(pMASK,16);// protect input on 15 chars - \0
    char* p=strtok(pMASK,".\0");
    while(p!=0){
        j=j++;
          if(j==1)
            octm[0]=atoi(p);
          if(j==2)
            octm[1]=atoi(p);
          if(j==3)
            octm[2]=atoi(p);
          if(j==4)
            octm[3]=atoi(p);
            p=strtok(0,".\0");
    }
    for(int i=0;i<4;i++){
        j=octm[i];
    calc(j,&c);// call calc quantity 1 bits in mask 
 
    }
delete []pMASK;// clear memory
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.12.2017, 23:26
Ответы с готовыми решениями:

Для чего служит обозначение L перед строковым литератом
Вот код #include &lt;iostream&gt; #include &lt;string&gt; using namespace std; int...

Для чего нужно писать в int main() в скобках всякие args потом объявлять переменные, и прочее. Для чего если можно в сборках это все обьявлять.
Для чего нужно писать в int main() в скобках всякие args потом объявлять...

Реализация функций reserve и clear для вектора
Мне нужно самой написать реализацию. От что у меня есть: template&lt;typename T&gt;...

Отличие getline() от cin.getline()
Чем отличается getline() от cin.getline() ?

.getline для чисел
Заметил, что не работает .getline при считывании из файла чисел. Хотелось бы...

2
zss
Модератор
Эксперт С++
7186 / 6681 / 4230
Регистрация: 18.12.2011
Сообщений: 17,629
Завершенные тесты: 1
11.12.2017, 07:35 2
После чтения 15 символов указатель потока стоит на 16-м символе и при последующем чтении передастся остальная часть строки.
Чтобы этого не произошло, этот остаток удалить из потока.
0
prado777
2 / 2 / 1
Регистрация: 20.11.2017
Сообщений: 41
Завершенные тесты: 1
11.12.2017, 13:36  [ТС] 3
В принципе понятно, но вот если я не очищу остаток из потока, то при последующем чтении, как Вы написали, этот остаток будет в pMASK, но когда я после
Цитата Сообщение от prado777 Посмотреть сообщение
cin.getline(pMASK,16);// protect input on 15 chars - \0
ставлю строку
C++
1
cout<<pIP<<endl;
- то там нет никакого остатка
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.12.2017, 13:36

Чтение текстовых файлов для новичков (getline)
Задача чтения и обработки текстового файла - одна из самых распространенных....

использую cin.getline() для заполнения динамического массива, и шляпа
делал задачку в теме ниже, типа заменить в строке символ &quot;:&quot; на &quot;;&quot;, решил...

Можно ли использовать cin.getline для указателя типа char*
Вот к примеру код он работает, но при отладке Ошибка доступа. #include...


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

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

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