1 / 25

Форматирование

Форматирование. Библиотека потоков С++ предусматривает три способа управления форматов выходных данных: вызов форматирующих функций-элементов использование флагов использование манипуляторов. 1. Форматирующие функции-элементы.

pierce
Download Presentation

Форматирование

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Форматирование • Библиотека потоков С++ предусматривает три способа управления форматов выходных данных: • вызов форматирующих функций-элементов • использование флагов • использование манипуляторов

  2. 1. Форматирующие функции-элементы • Для чтения и установки ширины поля потока в классе ios имеется функция width

  3. Применяемый при вводе, метод (функция член класса) width может быть использован для задания максимального числа читаемых символов • Применяемый при выводе, задает минимальную ширину поля • Если ширина меньше заданной, выход заполняется дополнительными символами fill • Если больше, значение width игнорируется. По умолчанию width = 0 (выход не дополняется и не обрезается) width обнуляется после каждого помещения данных в поток

  4. Пример ограничения числа вводимых символов при вводе: #include <iostream.h> const int MAX_LEN = 10; int main(void) { char name[MAX_LEN]; cout << "Введите имя:"; cin.width(MAX_LEN); cin >> name; return 0; }

  5. Пример использования для выравнивания правого поля при выводе: #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; }

  6. Для чтения или изменения заполняющего символа можно применять функции ios:fill По умолчанию - символ заполнения пробел

  7. Функции ios:precision могут применяться при выводе чисел с плавающей точкой

  8. По умолчанию точность равна 6 цифрам. Если установлен флаг scientific или fixed задается число цифр, выводимых после запятой • Если эти флаги не заданы - задается общее число цифр

  9. #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; }

  10. 2. Флаги • В потоках С++ имеются флаги формата. Они задают, каким образом форматируется ввод и вывод. • Флаги являются битовыми полями, хранящимися в переменнойlong

  11. Следующая таблица описывает флаги форматирования

  12. 3. Манипуляторы • Манипуляторы - это функции, которые можно включать в цепочку последовательных операций помещения и извлечения. За исключением setw, изменения, внесенные манипуляторами, сохраняются до следующей установки • Манипуляторы, не требующие аргументов, называются простыми • Предопределенные простые манипуляторы показаны в следующей таблице

  13. #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; };

  14. Параметризованные манипуляторы требуют спецификации аргументов

  15. #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; }

  16. Ошибки потоков • Все объекты потоки происходят от класса ios и наследуют элемент данных state. Этот элемент представляет состояние потока в виде битового множества • Все возможные состояния задаются классом ios, который определяется вiostream.h:

  17. class _EXPCLASS ios { public: enum io_state { goodbit = 0x00, // нет установленных битов, все OK eofbit = 0x01, // достигнут конец файла failbit = 0x02, // последний оператор i/o ошибочный // использование потока может продолжаться, // после того как бит будет сброшен badbit = 0x04, // попытка неправильной операции // Серьезная ошибка, потоком, скорее // всего, нельзя будет пользоваться hardfail = 0x08 // невосстановимая ошибка, обычно связанная // с неисправностьюоборудования }; // // };

  18. Состояния потока • Существуют различные функции и операции, позволяющие читать состояние потока, а также функции для установки или очистки состояния потока

  19. Методы опроса состояния потока

  20. Операция void*( ) всякий раз вызывается, когда поток сравнивается с нулем while (strm0bj) { // С потоком все в порядке }

  21. В следующей таблице приведены распространенные операции, которые можно производить с флагами потока.

More Related