Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94

Зацикленный Catch ( исключения )

15.04.2013, 12:11. Показов 2192. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток. Столкнулся с такой проблемой: В ниже приведенном коде, почему то, при установке флага failbit, когда управление передается catch, она зацикливается в while и вывод в поток cout происходит бесконечно, хотя она должна была вернуть управление в блок try после выполнения своих функций, а именно: вывода сообщения об ошибке. Подскажите пожалуйста в чем дело?
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
//---------------------------------------------------------------------------
#include <windows.h>
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
char buf[600];
//---------------------------------------------------------------------------
char* Rus(char* text)
{
 CharToOem(text, buf);
 return buf;
}
//---------------------------------------------------------------------------
void sort(float* arr)
{
 float temp = 0;
 int k = 0;
 for( int j = 0; j < 5; j++ )
        for( k = 1 + j; k < 5; k++ )
        {
                if( arr[j] > arr[k] )
                {
                        temp = arr[j];
                        arr[j] = arr[k];
                        arr[k] = temp;
                }
        }
 }
//---------------------------------------------------------------------------
class ErrCatch
{};
//---------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
 float arr[5];
 cout << Rus(" \n Ââåäèòå 5 ÷èñåë ñ ïëàâàþùåé òî÷êîé: \n");
 while(true)
 {
  try
  {
   for ( int j = 0; j < 5; j++ )
        cin >> arr[j];
   if(cin.fail())
   { cin.clear(ios::goodbit); throw ErrCatch();}
   else
        break;
   }
 
  catch(ErrCatch)
  {
   cerr << Rus("\n Íåâåðíûé ôîðìàò ââîäà!Äîïóñòèìûå ñèìâîëû(0-9 è . )!\n");
   continue;
  }
 }
 
 sort(arr);
 
 cout << Rus(" \n Îòñîðòèðîâàííûé ìàññèâ: \n");
 for ( int j = 0; j < 5; j++ )
 cout << arr[j] << ' ';
 
 
 
 
 
 
 system("PAUSE");
        return 0;
}
//---------------------------------------------------------------------------
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.04.2013, 12:11
Ответы с готовыми решениями:

Исключения try-catch
Здравствуйте, пытаюсь с помощь try-catch сделать обработку исключений. #include &lt;iostream&gt; #include &lt;cmath&gt; #include...

Разбор блока catch (исключения)
Задание звучит так: Даны две функции: double hmean(double a, double b) throw(hmean_error) - нахождение среднего гармонического. ...

Обработка исключения на русские буквы (try/catch)
Доброго времени суток. Хотелось бы узнать как обработать исключение на русские буквы через try/catch (желательно кодом) Заранее спасибо

5
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
15.04.2013, 12:35
continue убрать из 54 строки и написать там break;
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
15.04.2013, 12:42
Цитата Сообщение от fuzzytoozy Посмотреть сообщение
Подскажите пожалуйста в чем дело?
В буфере все остается как было. clear сбрасывает только флаги.
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//---------------------------------------------------------------------------
#include <windows.h>
#include <iostream>
using namespace std;
//---------------------------------------------------------------------------
char buf[600];
//---------------------------------------------------------------------------
char* Rus(char* text)
{
 CharToOem(text, buf);
 return buf;
}
//---------------------------------------------------------------------------
void sort(float* arr)
{
 float temp = 0;
 int k = 0;
 for( int j = 0; j < 5; j++ )
        for( k = 1 + j; k < 5; k++ )
        {
                if( arr[j] > arr[k] )
                {
                        temp = arr[j];
                        arr[j] = arr[k];
                        arr[k] = temp;
                }
        }
 }
//---------------------------------------------------------------------------
class ErrCatch
{};
//---------------------------------------------------------------------------
 
int main(int argc, char* argv[])
{
 float arr[5];
 
 while(true)
 {
     cout << Rus(" \n Введите 5 чисел с плавающей точкой: \n");
  try
  {
   for ( int j = 0; j < 5; j++ )
        cin >> arr[j];
   if(cin.fail())
   { cin.clear(std::ios::goodbit); 
      std::cin.ignore(std::cin.rdbuf()->in_avail());
      throw ErrCatch();}
   else
        break;
   }
 
  catch(ErrCatch)
  {
   cerr << Rus("\n Неверный формат ввода!Допустимые символы(0-9 и . )!\n");
   continue;
  }
 }
 
 sort(arr);
 
 cout << Rus(" \n Отсортированный массив: \n");
 for ( int j = 0; j < 5; j++ )
 cout << arr[j] << ' ';
 
 
 
 
 
 
 system("PAUSE");
        return 0;
}
1
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
15.04.2013, 13:01  [ТС]
спасибки, помогло. А можно поподробней об вот этом ? cin.ignore( cin.rdbuff()->in_avail());

Добавлено через 5 минут
Если я правильно понял, то функция Rdbuff() возвращает указатель на буфер символов, находящихся в потоке cin, а функция in_avail() возвращает указатель на конец этого буфера, после чего функция ignore() уничтожает все символы в буфере. Верно ?
0
Неэпический
 Аватар для Croessmah
18144 / 10728 / 2066
Регистрация: 27.09.2012
Сообщений: 27,028
Записей в блоге: 1
15.04.2013, 13:09
Цитата Сообщение от fuzzytoozy Посмотреть сообщение
возвращает указатель на буфер символов,
указатель на streambuf
std::ios::rdbuf
Цитата Сообщение от fuzzytoozy Посмотреть сообщение
а функция in_avail() возвращает указатель на конец этого буфера,
Кол-во символов, доступных для чтения
std::streambuf::in_avail
0
9 / 9 / 7
Регистрация: 23.11.2012
Сообщений: 94
15.04.2013, 14:04  [ТС]
спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.04.2013, 14:04
Помогаю со студенческими работами здесь

Передача исключения из одного catch-блока в другой
Всем привет! Начал тут изучать исключения в С++, хотел бы кое-что прояснить. Если я всё правильно понял, процесс обработки исключений...

Табулирование функции используя исключения (try, throw, catch)
Написать программу, которая выводит таблицу значений функции y= sqrt(5-pow(x,3)), шаг и интервал ввести с клавиатуры. Использовать...

Как передать управление в блок catch после системного исключения (компилятор g++)?
Вот пример: не удаётся это сделать #include &lt;windows.h&gt; #include &lt;stdio.h&gt; //Эта функция- НОВЫЙ обработчик...

Работает ли указатель на базовый класс исключения, когда попадает в блок catch
Работает ли указатель на базовый класс исключения, когда попадает в блок catch так же как обычно? То есть, если есть переопределенные...

Почему некоторые исключения невозможно обработать стандартным образом при помощи try catch?
Почему некоторые исключения невозможно обработать стандартным образом при помощи try catch? Вместо обработки программу тупо завершается.


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru