Состояние потока ввода можно проверить следующим образом:
Чтобы программа могла определить, как прошла операция ввода-вывода, каждый поток (в том числе стандартный) в каждый момент времени имеет связанное с ним состояние (находится в некотором состоянии):
· состояние good означает, что во время предыдущей операции не произошло никаких непредвиденных событий и может быть выполнена следующая операция ввода-вывода, в остальных случаях следующая операция выполнена не будет;
· состояние fail означает, что операция завершилась неудачно, операции обмена не выполняются, однако поток не испорчен и никакие символы не потеряны; состояние устанавливается обычнопри ошибках форматирования в процессе чтения (например, попытке прочитать целое число, а символ оказывается недопустимым); поток из этого состояния можно вернуть в нормальное состояние с помощью метода clear() (например: if(stream. fail()) stream. clear();
· состояние bad – «тяжелое»; состояния fail и bad являются состояниями ошибки потока и операции обмена не выполняются; состояние bad включает в себя состояние fail;
· состояние hardfail означает фатальную ошибку;
· состояние eof может возникнуть только при операции чтения; для стандартного потока ввода это состояние возникает при нажатии Ctrl+Z; для файлов это состояние устанавливается при первой попытке чтения после последнего байта файла, при этом поток переводится в состояние fail;
-----------------------------------------------------------------------------------------
//пример 79.
while (cin >> i) cout << i << endl;
//неявный вызов оператора проверки состояния потока
// true возвращается в случае успешной операции
или
while ((cin >> i), cin.good()) //явный вызов функции cin.good()
cout << i << endl;
Уточнить ошибку поможет наличие после указанного оператора цикла следующих операторов:
if (cin.bad())
cout << "badbit set" << endl;
else if (cin.fail())
cout << "failbit set" << endl;
else if (cin.eof())
cout << "End of file" << endl;
-----------------------------------------------------------------------------------------
//пример 80.
//сложение двух чисел с проверкой правильности их ввода
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
Int integer1, integer2, sum;
cout << "Input chislo 1\n ";
if ( cin >> integer1, cin.good() )
{
cout << " Input chislo 2\n ";
if ( cin >> integer2, cin.good() )
{
sum = integer1 + integer2;
cout << "sum = " << sum << endl;
}
else {
cout << "chislo 2?" << endl;
_getch();
return 1;
}
}
else {
cout << "chislo 1?" << endl;
_getch();
return 2;
}
_getch();
return 0;
}
Результаты работы:
Input chislo 1
11
Input chislo 2
22
sum = 33
Input chislo 1
11
Input chislo 2
ff
chislo 2?
Input chislo 1
ff
chislo 1?
-----------------------------------------------------------------------------------------
//пример 81.
У состояния потока есть одна особенность – если в нем установился какой-то из «нехороших» битов, то он сам по себе не сбросится, и любая операция ввода-вывода с этим потоком будет в дальнейшем проигнорирована. Поэтому, если нужно продолжить ввод после анализа ошибки, то надо сначала очистить флаги специальной функцией clear(), аргументом которой по умолчанию является состояние потока goodbit:
if (cin.bad()) {
cin.clear(); // очищаем флаги
cin. sync (); // очищаем поток
cin >> i; // пытаемся повторить ввод
}
или:
int main()
{
Int i;
while (true) //бесконечный цикл
{
cout << "input int" << endl;
cin >> i;
if (cin.good()) //если нет ошибок при вводе
{ //……
break; //выход из бесконечного цикла
}
cin.clear(); //если ошибка при вводе, очищаем флаги
cout << "error" << endl;
cin.ignore(10, '\n'); //функция извлекает оставшиеся символы из потока,
// ее параметры: 10- количество удаляемых символов (1–по умолчанию),
//’\n’ – символ-ограничитель – тоже удаляется из потока,
//по умолчанию символ-ограничитель – конец файла
}
cout << i << endl;
_getch();
return 0;
}
-----------------------------------------------------------------------------------------
Перекодировка кириллицы
//пример 82.
int main()
{
//кодовая таблица 866 – MS-DOS
char * d = " Минск ";
cout << d << endl; //╠шэёъ
cout << char('\x80') << endl; //A, код в 16 с/с
cout << char('\200') << endl; //A, код в 8 с/с
_getch();
return 0;
}
-----------------------------------------------------------------------------------------
//пример 83.
#include <locale.h>
int main()
{ // кодовая таблица 1251 – MS Windows
setlocale(LC_ALL, ".1251"); // или setlocale(LC_ALL, "rus");
char * d = " Минск ";
cout << d << endl; //Минск
cout << char('\xC0') << endl; //A, код в 16 с/с
cout << char('\300') << endl; //A, код в 8 с/с
_getch();
return 0;
}
-----------------------------------------------------------------------------------------
//пример 84.
#include <clocale>
int main()
{
setlocale(LC_ALL, ".1251");
char * d = " Минск ";
cout << d << endl; //Минск
cout << char('\xC0')<< endl; //A, код в 16 с/с
cout << char('\ 0 300') << endl; // 0, код в 8 с/с (error!!!)
// неверное задание кода символа
_getch();
return 0;
}
-----------------------------------------------------------------------------------------
//пример 85.
#include <locale.h>
int main()
{ // кодовая таблица 1251 – MS Windows
setlocale(LC_ALL, ".1251");
char * d = " Минск ";
cout << d << endl; //Минск
cout << char('\xA1') << endl; //Ў, код в 16 с/с
cout << char('\241') << endl; // Ў, код в 8 с/с
_getch();
return 0;
}
-----------------------------------------------------------------------------------------
Кодовые таблицы
Исторически сложилось так, что первые разработчики компьютеров были носителями английского языка. Для вывода информации им требовалось: 26 букв английского алфавита (строчных), 26 прописных, 9 знаков препинания (.,:! ";? ()), пробел, 10 цифр, 5 знаков арифметических действий (+,-,*, /, ^) и специальные символы (№ % _ # $, и так далее ^, &, >, <, |, \). Получается чуть больше 100 символов. Такой сравнительно небольшой базовый набор символов можно закодировать набором двоичных чисел от 0 до 27 (всего 128 позиций), при помощи таблиц соответствия этого набора машинным кодам (фактически, двоичным числам), что и было сделано. Таблица соответствия была названа ASCII (A merican S tandard C ode for I nformation I nterchange, произносим «аскей»).
Однако базового набора кодов стало быстро не хватать, что потребовало расширения таблицы ASCII. Из соображений удобства кодирования и из технических соображений при представлении символов стали пользоваться равномерными кодами, т.е. двоичными группами из 8 двоичных знаков (1 символ – 1 байт) – получили 28 = 256 двоичных символов (256 комбинаций двоичных символов 0 и 1). В результате возникла новая таблица кодировок, получившая название «расширенная таблица ASCII».
Эта система является международной (общепринятой) только в первой половине кодов (от 0 до 127), вторая половина кодов (от 128 до 255) является национальной и различна для разных стран. В рамках таблицы ASCIIсоздание многоязычных документов являлось проблематичной, а в большинстве случаев и невыполнимой задачей.
Программист, используя в программах, выполняемых в консольном режиме, строковые и символьные константы с русскими буквами, сталкивается с проблемой различия кодировок. В консольном режиме примеряется ОЕМ-кодировка, в которой для представления символов со значениями кодов 128-255 используется кодовая таблица 866 – MS DOS. В программах, исполняемых и создаваемых под управлением MS Windows, применяется для тех же символов кодовая таблица 1251 (ANSI-кодировка). Поэтому текст с русскими буквами (их коды находятся в диапазоне 128-255), подготовленный в редакторе MS Windows, нельзя правильно отобразить в консольном окне – нужна перекодировка из MS Windows в MS DOS и обратно.
Рассмотрим структуру таблицы ASCII. Для удобства символы в ней пронумерованы и в шестнадцатеричной системе счисления от 0 - 7F. Первые знакоместа в таблице занимают непечатаемые символы (0 до 7F), затем следуют печатаемые символы (20 - 7F).
Таблица 1. ASCII-Коды (символы с кодами 0-127)
![]() |
| dec | hex | char | dec | hex | char | dec | hex | char |
| 0 | 0 | 46 | 2E | . | 92 | 5C | \ | |
| 1 | 1 | 47 | 2F | / | 93 | 5D | ] | |
| 2 | 2 | 48 | 30 | 0 | 94 | 5E | ^ | |
| 3 | 3 | 49 | 31 | 1 | 95 | 5F | _ | |
| 4 | 4 | 50 | 32 | 2 | 96 | 60 | ' | |
| 5 | 5 | 51 | 33 | 3 | 97 | 61 | a | |
| 6 | 6 | 52 | 34 | 4 | 98 | 62 | b | |
| 7 | 7 | звонок | 53 | 35 | 5 | 99 | 63 | c |
| 8 | 8 | 54 | 36 | 6 | 100 | 64 | d | |
| 9 | 9 | 55 | 37 | 7 | 101 | 65 | e | |
| 10 | A | перевод строки | 56 | 38 | 8 | 102 | 66 | f |
| 11 | B | 57 | 39 | 9 | 103 | 67 | g | |
| 12 | C | 58 | 3A | : | 104 | 68 | h | |
| 13 | D | возврат каретки | 59 | 3B | ; | 105 | 69 | i |
| 14 | E | 60 | 3C | < | 106 | 6A | j | |
| 15 | F | 61 | 3D | = | 107 | 6B | k | |
| 16 | 10 | 62 | 3E | > | 108 | 6C | l | |
| 17 | 11 | 63 | 3F | ? | 109 | 6D | m | |
| 18 | 12 | 64 | 40 | @ | 110 | 6E | n | |
| 19 | 13 | 65 | 41 | A | 111 | 6F | o | |
| 20 | 14 | 66 | 42 | B | 112 | 70 | p | |
| 21 | 15 | 67 | 43 | C | 113 | 71 | q | |
| 22 | 16 | 68 | 44 | D | 114 | 72 | r | |
| 23 | 17 | 69 | 45 | E | 115 | 73 | s | |
| 24 | 18 | 70 | 46 | F | 116 | 74 | t | |
| 25 | 19 | 71 | 47 | G | 117 | 75 | u | |
| 26 | 1A | 72 | 48 | H | 118 | 76 | v | |
| 27 | 1B | 73 | 49 | I | 119 | 77 | w | |
| 28 | 1C | 74 | 4A | J | 120 | 78 | x | |
| 29 | 1D | 75 | 4B | K | 121 | 79 | y | |
| 30 | 1E | 76 | 4C | L | 122 | 7A | z | |
| 31 | 1F | 77 | 4D | M | 123 | 7B | { | |
| 32 | 20 | пробел | 78 | 4E | N | 124 | 7C | ¦ |
| 33 | 21 | ! | 79 | 4F | O | 125 | 7D | } |
| 34 | 22 | '' | 80 | 50 | P | 126 | 7E | ~ |
| 35 | 23 | # | 81 | 51 | Q | 127 | 7F | del |
| 36 | 24 | $ | 82 | 52 | R | |||
| 37 | 25 | % | 83 | 53 | S | |||
| 38 | 26 | & | 84 | 54 | T | |||
| 39 | 27 | ' | 85 | 55 | U | |||
| 40 | 28 | ( | 86 | 56 | V | |||
| 41 | 29 | ) | 87 | 57 | W | |||
| 42 | 2A | * | 88 | 58 | X | |||
| 43 | 2B | + | 89 | 59 | Y | |||
| 44 | 2C | , | 90 | 5A | Z | |||
| 45 | 2D | - | 91 | 5B | [ |
![]() |
Таблица 2. Кодовая таблица 866 – MS-DOS
(символы с кодами 127-255)
| dec | hex | char | dec | hex | char | dec | hex | char | dec | hex | char | dec | hex | char | dec | hex | char |
| 128 | 80 | А | 150 | 96 | Ц | 172 | AC | м | 193 | C1 | ┴ | 214 | D6 | ╓ | 235 | EB | ы |
| 129 | 81 | Б | 151 | 97 | Ч | 173 | AD | н | 194 | C2 | ┬ | 215 | D7 | ╫ | 236 | EC | ь |
| 130 | 82 | В | 152 | 98 | Ш | 174 | AE | о | 195 | C3 | ├ | 216 | D8 | ╪ | 237 | ED | э |
| 131 | 83 | Г | 153 | 99 | Щ | 175 | AF | п | 196 | C4 | ─ | 217 | D9 | ┘ | 238 | EE | ю |
| 132 | 84 | Д | 154 | 9A | Ъ | 176 | B0 | - | 197 | C5 | ┼ | 218 | DA | ┌ | 239 | EF | я |
| 133 | 85 | Е | 155 | 9B | Ы | 177 | B1 | - | 198 | C6 | ╞ | 219 | DB | █ | 240 | F0 | Ё |
| 134 | 86 | Ж | 156 | 9C | Ь | 178 | B2 | - | 199 | C7 | ╟ | 220 | DC | ▄ | 241 | F1 | ё |
| 135 | 87 | З | 157 | 9D | Э | 179 | B3 | │ | 200 | C8 | ╚ | 221 | DD | ▌ | 242 | F2 | ≥ |
| 136 | 88 | И | 158 | 9E | Ю | 180 | B4 | ┤ | 201 | C9 | ╔ | 222 | DE | ▐ | 243 | F3 | ≤ |
| 137 | 89 | Й | 159 | 9F | Я | 181 | B5 | ╡ | 202 | CA | ╩ | 223 | DF | ▀ | 244 | F4 | ⌠ |
| 138 | 8A | К | 160 | A0 | а | 182 | B6 | ╢ | 203 | CB | ╦ | 224 | E0 | р | 245 | F5 | ⌡ |
| 139 | 8B | Л | 161 | A1 | б | 183 | B7 | ╖ | 204 | CC | ╠ | 225 | E1 | с | 246 | F6 | + |
| 140 | 8C | М | 162 | A2 | в | 184 | B8 | ╕ | 205 | CD | ═ | 226 | E2 | т | 247 | F7 | ≈ |
| 141 | 8D | Н | 163 | A3 | г | 185 | B9 | ╣ | 206 | CE | ╬ | 227 | E3 | у | 248 | F8 | |
| 142 | 8E | О | 164 | A4 | д | 186 | BA | ║ | 207 | CF | ╧ | 228 | E4 | ф | 249 | F9 | |
| 143 | 8F | П | 165 | A5 | е | 187 | BB | ╗ | 208 | D0 | ╨ | 229 | E5 | х | 250 | FA | ● |
| 144 | 90 | Р | 166 | A6 | ж | 188 | BC | ╝ | 209 | D1 | ╤ | 230 | E6 | ц | 251 | FB | √ |
| 145 | 91 | С | 167 | A7 | з | 189 | BD | ╜ | 210 | D2 | ╥ | 231 | E7 | ч | 252 | FC | n |
| 146 | 92 | Т | 168 | A8 | и | 190 | BE | ╛ | 211 | D3 | ╙ | 232 | E8 | ш | 253 | FD | 2 |
| 147 | 93 | У | 169 | A9 | й | 191 | BF | ┐ | 212 | D4 | ╘ | 233 | E9 | щ | 254 | FE | ■ |
| 148 | 94 | Ф | 170 | AA | к | 192 | C0 | └ | 213 | D5 | ╒ | 234 | EA | ъ | 255 | FF | |
| 149 | 95 | Х | 171 | AB | л |
Таблица 3. Кодовая таблица 1251 – MS Windows
(символы с кодами 127-255, даны выборочно)
| dec | hex | char | dec | hex | char | dec | hex | char | dec | hex | char | dec | hex | char | dec | hex | char | ||||
| 128 | 80 | 150 | 96 | 172 | AC | 193 | C1 | Б | 214 | D6 | Ц | 235 | EB | л | |||||||
| 129 | 81 | 151 | 97 | 173 | AD | - | 194 | C2 | В | 215 | D7 | Ч | 236 | EC | м | ||||||
| 130 | 82 | 152 | 98 | 174 | AE | ® | 195 | C3 | Г | 216 | D8 | Ш | 237 | ED | н | ||||||
| 131 | 83 | 153 | 99 | 175 | AF | Ï | 196 | C4 | Д | 217 | D9 | Щ | 238 | EE | о | ||||||
| 132 | 84 | 154 | 9A | 176 | B0 | º | 197 | C5 | Е | 218 | DA | Ъ | 239 | EF | п | ||||||
| 133 | 85 | 155 | 9B | 177 | B1 | ± | 198 | C6 | Ж | 219 | DB | Ы | 240 | F0 | р | ||||||
| 134 | 86 | 156 | 9C | 178 | B2 | | 199 | C7 | З | 220 | DC | Ь | 241 | F1 | с | ||||||
| 135 | 87 | 157 | 9D | 179 | B3 | i | 200 | C8 | И | 221 | DD | Э | 242 | F2 | т | ||||||
| 136 | 88 | 158 | 9E | 180 | B4 | r | 201 | C9 | Й | 222 | DE | Ю | 243 | F3 | у | ||||||
| 137 | 89 | 159 | 9F | 181 | B5 | μ | 202 | CA | К | 223 | DF | Я | 244 | F4 | ф | ||||||
| 138 | 8A | 160 | A0 | 182 | B6 | ¶ | 203 | CB | Л | 224 | E0 | а | 245 | F5 | х | ||||||
| 139 | 8B | 161 | A1 | Ў | 183 | B7 | . | 204 | CC | М | 225 | E1 | б | 246 | F6 | ц | |||||
| 140 | 8C | 162 | A2 | ў | 184 | B8 | ë | 205 | CD | Н | 226 | E2 | в | 247 | F7 | ч | |||||
| 141 | 8D | 163 | A3 | J | 185 | B9 | № | 206 | CE | О | 227 | E3 | г | 248 | F8 | ш | |||||
| 142 | 8E | 164 | A4 | 186 | BA | ε | 207 | CF | П | 228 | E4 | д | 249 | F9 | щ | ||||||
| 143 | 8F | 165 | A5 | ¤ | 187 | BB | » | 208 | D0 | Р | 229 | E5 | е | 250 | FA | ъ | |||||
| 144 | 90 | 166 | A6 | ¦ | 188 | BC | j | 209 | D1 | С | 230 | E6 | ж | 251 | FB | ы | |||||
| 145 | 91 | 167 | A7 | § | 189 | BD | S | 210 | D2 | Т | 231 | E7 | з | 252 | FC | ь | |||||
| 146 | 92 | 168 | A8 | Ё | 190 | BE | s | 211 | D3 | У | 232 | E8 | и | 253 | FD | э | |||||
| 147 | 93 | 169 | A9 | © | 191 | BF | ï | 212 | D4 | Ф | 233 | E9 | й | 254 | FE | ю | |||||
| 148 | 94 | 170 | AA | Є | 192 | C0 | А | 213 | D5 | Х | 234 | EA | к | 255 | FF | я | |||||
| 149 | 95 | 171 | AB | « |
|
| 䦋㌌㏒㧀좈琰茞ᓀ㵂Ü | 䦋㌌㏒㧀좈琰茞ᓀ㵂Ü | 䦋㌌㏒㧀좈琰茞ᓀ㵂Ü | ||||||||||||
Литература
- Лафоре Р. Объектно-ориентированное программирование на С++. Классика Computer Science/ 4-е изд –СПб.: Питер, 2007. – 928с.
- Павловская Т.А. С/С++. Программирование на языке высокого уровня – СПб.: Питер, 2005. – 461с.
- Подбельский В.В. Стандартный С++: учеб.пособие. - М.: Финансы и статистика, 2008. – 688с.
- Дейтел Харви, Дейтел Пол. Как программировать на С++: Пер. с англ. – М.: ЗАО «Издательство БИНОМ», 1998г. – 1024с.
- Шилдт Г. Искусство программирования на С++. – СПб.:БХВ – Петербург, 2005. – 496с.
- Павловская Т.А., Щупак Ю.А. С/С++. Структурное программирование: Практикум. –
СПб.: Питер, 2007. – 239с. - Павловская Т.А., Щупак Ю.А. С++. Объектно-ориентированное программирование:
Практикум. – СПб.: Питер, 2008. – 265с. - Шиманович Е.Л. С/С++ в примерах и задачах. Минск, ООО «Новое знание», 2004, –528с.
- Буч Г. Объектно – ориентированный анализ и проектирование. Москва, Бином, 2000.
- Стрикелева Л.В. Конспект лекций (в электронном виде). 2017 год!!!
- Стрикелева Л.В. Для каждой лабораторной работы (в электронном виде):
задания, методические указания. 201 7 год!!! - Стрикелева Л.В. Тесты в среде E- University







