Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
1

Работа с cin при считывании с потока ввода

12.12.2014, 21:00. Просмотров 585. Ответов 4
Метки нет (Все метки)

есть кусочек кода
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
while (1)
    {
        string buf = name;
        cout << "Message : ";
        string symbolBuf = "";
        while (cin >> symbolBuf){
            int timeSymbol = GetTickCount();
            if (symbolBuf[symbolBuf.length()] != '\r')
                buf += symbolBuf + " ";
            else break;
            symbolTime.push_back((GetTickCount() - timeSymbol) / symbolBuf.length());
            wordTime.push_back(GetTickCount() - timeSymbol);
        }
        cin.ignore();
                //дальше другой код
помогите сделать, чтобы внутренний цикл while можно было завершить, когда в конце ввода строки нажат enter, а также, помогите сделать, чтобы при повторном обращении к внутреннему циклу while, его условие срабатывало, а не возвращало false
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.12.2014, 21:00
Ответы с готовыми решениями:

Обработка ошибок ввода из потока cin
Доброго времени суток всем! Помогите пожалуйста разобраться. После ввода буквы например, то есть...

Cin перестал читать из потока ввода
Возникла проблема при чтении из потока. Может кто знает, как решить эту проблему с cin? ...

Использование потока cin для ввода символов
Вот первая функция, cin.get(ch) которую я не понимаю int main() { char ch; cin.get(ch);...

Не работает cin.getline при считывании строки большей буфера
Доброго всем времени суток!:) Проблема состоит в том, что если ввести 4 и более символов...

Ошибка при повторном получении данных из потока cin
Добрый день, уважаемые форумчане. Делал учебную задачу и столкнулся с проблемой, которую...

4
Шенец Николай
10 / 10 / 5
Регистрация: 10.12.2014
Сообщений: 60
13.12.2014, 00:42 2
По поводу второго вопроса - просто сделай очистку потока cin.clear(), fflush(stdin).
А по первому я не понял - твой внутренний цикл работает бесконечно?
0
Fene4ka_
102 / 102 / 40
Регистрация: 24.01.2014
Сообщений: 1,244
13.12.2014, 01:02  [ТС] 3
Шенец Николай, да, пока не нажму ctrl+Z -> enter, но это не удобно, нужно сделать завершение на enter
0
DU
1490 / 1136 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
13.12.2014, 01:15 4
вообще с потоком ввода по простому не выйдет читать каждый символ. оператор >> работает так, что вы не выйдете из функции operator >> пока не нажмете ентер и этот ентер ни в какие буферы не попадает. если вам нужно отлавливать каждый символ, то можно попробовать getch() из <conio.h> или забебажиться внутрь реализации оператора >> и посмотреть как там это реализовано (но это плохая идея).

а тут: symbolBuf[symbolBuf.length()] - выход за пределы.
0
Шенец Николай
10 / 10 / 5
Регистрация: 10.12.2014
Сообщений: 60
13.12.2014, 12:46 5
я бы сделал так. Можно читать символы до любого разделителя, который тебя устроит. Например, тебе надо посчитать скорость набора слов, поэтому разумнее в качестве разделителя ввода для подсчета "скорости" использовать пробел. И да, сама введенная строка не нужна, зачем тратить память и плодить ошибки выхода за границы?)

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
#include<conio.h>
 
char ReadChars(unsigned int* k)
{ 
   char ch;
  *k=0;
   do
   {
      ch = getche(); //с выводом на консоль; если не хочешь отображать даже - используй getch().
      (*k)++;
   } while ((ch != ' ')||(ch != 13)); // тут ты можешь перечислить все удобные тебе разделители ввода
   return ch;
}
 
int main(int args, unsigned char* argv)
{
 ....
 while(1)
 {
    ...
    unsigned int wTimes = 0, lTimes = 0, tTime1, tTime2, count, wcount = 0;
    char ch;
    do
    {
       tTime1 = GetTickCount();
       ch = ReadChars(&count);
       tTime2 = GetTickCount();
       if (count>1) 
       {
         wTime += (tTime2-tTime1); //скорость ввода слов, включая 1-ые буквы, но не пробелы.
         wcount++; //считает кол-во "слов"
       }
       lTimes += ((tTime2-tTime1)/count);
    }while(ch != 13);
 
    if(wcount)  wTime = (wTime/wcount);
 }
}
Добавлено через 6 минут
в 30-ой строке и 36 wTimes, разумеется, должно быть)
0
13.12.2014, 12:46
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2014, 12:46

Работа функции cin.get(): не дожидается ввода символа в конце программы
Доброго времени суток, столкнулся с таким странным поведением cin.get(), после окончания ввода...

Защита от дурака при вводе текста с помощью: cin.get cin.clear cin.sync
Доброго времени суток. На С++ учусь с недавних пор. Имеется стандартная &quot;защита от дурака&quot; на ввод....

Очистка буфера ввода при работе с cin
Добрый вечер! Пытаюсь научиться работать с классами, подскажите пожалуйста, что я делаю не так. В...


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

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

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