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

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

Войти
Регистрация
Восстановить пароль
 
 
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
#1

Очистка потока ввода && строки - C++

26.02.2013, 23:04. Просмотров 16245. Ответов 29
Метки нет (Все метки)

как вобще грамотно очистить поток после ввода множества всяких вещей с клавиатуры?
если совсем не чистить то остаются нажатия клавиши enter, если применять такой код
C++
1
2
3
cin.clear();
while(cin.get() != '\n');
cin.get();
в конце каждой функции в программе, где происходит ввод, то в итоге пользователю приходится 4-5 лишних раз давить enter после ввода чего либо, т.е. эффект обратный. как реализовать очистку потока вывода грамотно?

и еще, есть функция
C++
1
2
3
4
5
6
7
8
void initialize_values(goods *db)
{
    for (int i = 0; i < base_size; i++) {
        strcpy(db[i].value, '\0');
        db[i].cost = 0;
        db[i].quantity = 0;
    }
}
инициализирует массив записей при старте программы. в дальнейшем предполагается использовать db[i].value как критерий существования записи: если строка нулевая, то запись пустая и её можно заполнить. но у меня почему то не получается использовать if(!db[i].value) { ...........}, он просто не срабатывет. причем если value инициализировано как strcpy(db[i].value, '\0') ,то программа выдает просто segmentation vault и не работает, а если strcpy(db[i].value, "\0"), то компилируется без ошибок, но опять же if(!db[i].value) { ...........} не работает. в чем ошибка?
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.02.2013, 23:04
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Очистка потока ввода && строки (C++):

Ошибка: multiple definition of `void std::swap<A>(A&amp;, A&amp;) - C++
Хочу специализировать swap для своего класса. Получаю ошибку. Вот код:#ifndef A_H #define A_H #include &lt;string&gt; class A { ...

Цикл и строки, очистка потока ввода - C++
Возникла проблема. При вводе &quot;Y&quot; цикл переходит сразу к следующему вооду, то есть пропускает &quot;cin.getline&quot;. Как исправить? #include...

Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration? - C++
Пытаюсь скомпилировать программу пишет friend ostrem&amp; operator &lt;&lt;(ostream&amp; outs, const Rational&amp;); - invalid function declaration. ...

В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9& - C++
В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура...

ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? - C++
void Array::getArray() // вывод массива { for (int ix = 0; ix &lt; size; ix++) cout &lt;&lt; setw(5) &lt;&lt; ptr; // вывод элементов...

функции && строки - C++
ребята,пожалуйста,помогите.В понедельник практику сдавать,а эти задачи НЕМОГУ. 1. Написать процедуру для суммирования матриц. С ее...

29
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
28.02.2013, 01:24 #16
http://www.daniweb.com/software-deve...e-input-stream
В частности код:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <ios>
#include <istream>
#include <limits>
template <typename CharT>
std::streamsize ignore_line (
  std::basic_istream<CharT>& in, bool always_discard = false )
{
  std::streamsize nread = 0;
  if ( always_discard
    || ( in.rdbuf()->sungetc() != std::char_traits<CharT>::eof()
    && in.get() != in.widen ( '\n' ) ) )
  {
    // The stream is good, and we haven't
    // read a full line yet, so clear it out
    in.ignore ( std::numeric_limits<std::streamsize>::max(), in.widen ( '\n' ) );
    nread = in.gcount();
  }
  return nread;
}
class ignoreline {
  bool _always_discard;
  mutable std::streamsize _nread;
public:
  ignoreline ( bool always_discard = false )
    : _always_discard ( always_discard ), _nread ( 0 )
  {}
  std::streamsize gcount() const { return _nread; }
  template <typename CharT>
  friend std::basic_istream<CharT>& operator>> (
    std::basic_istream<CharT>& in, const ignoreline& manip )
  {
    manip._nread = ignore_line ( in, manip._always_discard );
    return in;
  }
};
 
int main()
{
  std::cout<<"First input: ";
  std::cin.get();
  std::cout<<"Clearing cin.\n";
  std::cin>> ignoreline();
  std::cout<<"All done.\n";
}
0
vua72
415 / 415 / 85
Регистрация: 28.11.2010
Сообщений: 1,183
Завершенные тесты: 1
28.02.2013, 01:31 #17
Цитата Сообщение от alsav22 Посмотреть сообщение
Не понимаю только, что это continue даёт?
отбрасывает остаток строки, если строка была прочитана не полностью.
Там пример такой
Кликните здесь для просмотра всего текста
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
27
28
// truncate.cpp -- using get() to truncate input line, if necessary
#include <iostream>
const int SLEN = 10;
inline void eatline() { while (std::cin.get() != '\n') continue; }
int main()
{
    using std::cin;
    using std::cout;
    using std::endl;
 
    char name[SLEN];
    char title[SLEN];
    cout << "Enter your name: ";
    cin.get(name,SLEN);
    if (cin.peek() != '\n')
        cout << "Sorry, we only have enough room for "
                << name << endl;
    eatline();
    cout << "Dear " << name << ", enter your title: \n";
    cin.get(title,SLEN);
    if (cin.peek() != '\n')
        cout << "We were forced to truncate your title.\n";
    eatline();
    cout << " Name: " << name
         << "\nTitle: " << title << endl;
    // cin.get();
    return 0; 
}
0
Toshkarik
1141 / 858 / 51
Регистрация: 03.08.2011
Сообщений: 2,386
Завершенные тесты: 1
28.02.2013, 01:36 #18
vua72, этот continue там ни к чему, и написан, скорей всего, просто для читаемости.
0
gray_fox
What a waste!
1521 / 1226 / 70
Регистрация: 21.04.2012
Сообщений: 2,565
Завершенные тесты: 3
28.02.2013, 01:38 #19
Цитата Сообщение от alsav22 Посмотреть сообщение
Не понимаю только, что это continue даёт?
Ничего. Возможно для ясности.
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 01:44 #20
Цитата Сообщение от vua72 Посмотреть сообщение
отбрасывает остаток строки, если строка была прочитана не полностью.
Куда что там отбрасывать, если чтение по символу, пока не встретится '\n'? Что с continue, что без...
0
vua72
28.02.2013, 01:49
  #21

Не по теме:

все претензии к Прате

0
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
28.02.2013, 21:05  [ТС] #22
Цитата Сообщение от xtorne21st Посмотреть сообщение
C++
1
#define CIN_FLUSH if (std::cin.peek()) std::cin.ignore()
объясните что это пожалуйста и как юзать и как работает, нужно просто добавить этот макрос или еще в коде вызывать что либо?

Добавлено через 29 минут
разобрался с макросом, да еще и ошибочку в коде нашел, там динамическая память не очищалась в одном месте. с таким макросом поприятнее, но для выхода все еще нужно ввести q и дважды нажать enter
0
alsav22
5425 / 4820 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
28.02.2013, 21:25 #23
12 пост прочли?
1
[WRG]
51 / 51 / 9
Регистрация: 20.11.2011
Сообщений: 243
Записей в блоге: 1
02.03.2013, 21:06  [ТС] #24
благодарю, убрал и заработало!
0
sWINo_BACK_LAN
6 / 6 / 0
Регистрация: 30.03.2016
Сообщений: 30
29.11.2016, 17:57 #25
cin.sync();
0
game1progg
31 / 1 / 0
Регистрация: 07.01.2016
Сообщений: 44
27.01.2017, 05:41 #26
а как насчет:
C++
1
2
3
4
5
#include<algorithm>
 
void clean_screen(){
    system("cls");
}
0
keep_clear
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 16
25.05.2017, 11:15 #27
Уходит в цикл "Bad".
Как избавиться от цикла и повторно ввести данные для проверки на int?
C++
1
2
3
4
5
6
7
8
9
10
11
int iNum;
int b = 0;
while (b == 0) {
  cin >> iNum;
  if(cin.get() == (int)'\n') {
    cout << "OK" << endl;
    b = 1; // exit
  } else {
    cout << "Bad" << endl;
  }
}
0
sWINo_BACK_LAN
6 / 6 / 0
Регистрация: 30.03.2016
Сообщений: 30
25.05.2017, 14:05 #28
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int iNum;
int b = 0;
while (b == 0) {
cin.sync();
  cin >> iNum;
cin.clear();
  if(cin.get() == (int)'\n') {
    cout << "OK" << endl;
    b = 1; // exit
  } else {
    cout << "Bad" << endl;
  }
}
вроде, так работает
1
keep_clear
0 / 0 / 0
Регистрация: 16.09.2015
Сообщений: 16
25.05.2017, 14:18 #29
MrGluck редактируя код, забыл закрыть цикл уайл.
0
MrGluck
Модератор
Эксперт CЭксперт С++
7423 / 4538 / 673
Регистрация: 29.11.2010
Сообщений: 12,319
25.05.2017, 14:19 #30
Добавил, но } у вас не было. Это видно по логу изменений.
1
25.05.2017, 14:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2017, 14:19
Привет! Вот еще темы с ответами:

Порядок вычисления: операторы «|» и «||», «&» и «&&» - C++
В Java булевые операторы «|» и «||», и «&amp;» и «&amp;&amp;» отличаются друг от друга порядком вычеслений, а в C++ так же как и в Java или...

Friend ostream& operator<<(ostream& stream, CArr& obj); - C++
CArr.h #pragma once class CArr{ int* arr = nullptr; int size = 10; void swap(int *a, int *b); void swap(int &amp;a, int &amp;b); ...

Очистка потока ввода - C++
ПОМОГИТЕ НАЙТИ ОШИБКУ Ребят написал малюсенький фрагмент кода, но уже есть ошибка. после того как вводим сh, почему то нельзя ввести...

Очистка потока ввода - C++
Собственно тема подымалась в интернете, но внятного объяснения я не получил. Для ввода строки с пробелами использую cin.getline() Если...


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

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

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