250 likes | 391 Views
Форматирование. Библиотека потоков С++ предусматривает три способа управления форматов выходных данных: вызов форматирующих функций-элементов использование флагов использование манипуляторов. 1. Форматирующие функции-элементы.
E N D
Форматирование • Библиотека потоков С++ предусматривает три способа управления форматов выходных данных: • вызов форматирующих функций-элементов • использование флагов • использование манипуляторов
1. Форматирующие функции-элементы • Для чтения и установки ширины поля потока в классе ios имеется функция width
Применяемый при вводе, метод (функция член класса) width может быть использован для задания максимального числа читаемых символов • Применяемый при выводе, задает минимальную ширину поля • Если ширина меньше заданной, выход заполняется дополнительными символами fill • Если больше, значение width игнорируется. По умолчанию width = 0 (выход не дополняется и не обрезается) width обнуляется после каждого помещения данных в поток
Пример ограничения числа вводимых символов при вводе: #include <iostream.h> const int MAX_LEN = 10; int main(void) { char name[MAX_LEN]; cout << "Введите имя:"; cin.width(MAX_LEN); cin >> name; return 0; }
Пример использования для выравнивания правого поля при выводе: #include <iostream.h> const int FLD_LEN = 10; int main(void) { int x1=2867, y1=20051; cout.width(FLD_LEN); cout << x1 << '\n'; cout.width(FLD_LEN); cout << y1 << '\n'; return 0; }
Для чтения или изменения заполняющего символа можно применять функции ios:fill По умолчанию - символ заполнения пробел
Функции ios:precision могут применяться при выводе чисел с плавающей точкой
По умолчанию точность равна 6 цифрам. Если установлен флаг scientific или fixed задается число цифр, выводимых после запятой • Если эти флаги не заданы - задается общее число цифр
#include <iostream.h> int main(void) { float f = 3456.141592; double d = 50.2345639101; cout. precision(4); cout << d << '\n'; // 50.23 cout << f << '\n'; // 3456 cout.precision(3); cout << f << '\n'; // 3.46e+3 cout.precision(3); cout.setf(ios::fixed, ios::floatfield); // Тип Fixed cout << f << '\n'; // 3456.142 Тип Fixed return 0; }
2. Флаги • В потоках С++ имеются флаги формата. Они задают, каким образом форматируется ввод и вывод. • Флаги являются битовыми полями, хранящимися в переменнойlong
Следующая таблица описывает флаги форматирования
3. Манипуляторы • Манипуляторы - это функции, которые можно включать в цепочку последовательных операций помещения и извлечения. За исключением setw, изменения, внесенные манипуляторами, сохраняются до следующей установки • Манипуляторы, не требующие аргументов, называются простыми • Предопределенные простые манипуляторы показаны в следующей таблице
#include <iostream.h> #include <iomanip.h> int main(void) { int i; cout << "Введите число:"; cin >> i; if (!cin) // Проверить корректность введенного { cout << "Ошибочный ввод" << endl; } else { cout << "Hex:" << hex << i <<endl; cout << "Oct:" << oct << i <<endl; cout << "Dec:" << dec << i << endl; } return 0; };
Параметризованные манипуляторы требуют спецификации аргументов
#include <iostream.h> #include <iomanip.h> int main(void) { double dbls = { 1.245, -12.99133, 134.007804, -2.345, 0.000003 }; cout << setfill('.') << setprecision(4) << setiosflags(ios::showpoint | ios::fixed | ios::right); for (int i=0; i<sizeof(dbls)/sizeof(dbls[0]); i++) cout << "результат" << setw(20) << dbls[i] << endl; return 0; }
Ошибки потоков • Все объекты потоки происходят от класса ios и наследуют элемент данных state. Этот элемент представляет состояние потока в виде битового множества • Все возможные состояния задаются классом ios, который определяется вiostream.h:
class _EXPCLASS ios { public: enum io_state { goodbit = 0x00, // нет установленных битов, все OK eofbit = 0x01, // достигнут конец файла failbit = 0x02, // последний оператор i/o ошибочный // использование потока может продолжаться, // после того как бит будет сброшен badbit = 0x04, // попытка неправильной операции // Серьезная ошибка, потоком, скорее // всего, нельзя будет пользоваться hardfail = 0x08 // невосстановимая ошибка, обычно связанная // с неисправностьюоборудования }; // // };
Состояния потока • Существуют различные функции и операции, позволяющие читать состояние потока, а также функции для установки или очистки состояния потока
Операция void*( ) всякий раз вызывается, когда поток сравнивается с нулем while (strm0bj) { // С потоком все в порядке }
В следующей таблице приведены распространенные операции, которые можно производить с флагами потока.