|
Программирование >> Структура ядра и системные вызовы
Операция Функция int precision(int) long setf(long bitFlag) long setf (long bitFlag long bitReld) Устанавлииает количество значащих цифр, подлежащих отображению при выводе вещественных чисел. Возвращает предыдущее значение точности представления вещественных чисел Добавляет бит(ы) формата согласно bitFlag к коду, определяющему существующий формат. Возвращает старое значение кода формата. Возможные значения для bitFlag. ios::showbase Отображает основание системы счисления ios::showpoint Отображает конечную десятичную запятую и нуль ios;:showpos Отображает символ знака (+ или -) для числовых значений ios::uppercase Использует X для отображения шестнадцатеричных чисел (если установлено значение iosr.showhase) и Е для представления чисел с плавающей запятой в экспоненциальном формате Устанавливает/сбрасывает (в соответствии с bitFlag) биты формата, как указано и bitfield. Возвращает старое значение состояния формата. Возможные значения параметров birFieid и bitFlag. ios::basetield ios::hex ios::oct ios::dec ios::floatfield ios::fixed ios::scientiflc ios::adjustfield ios::left ios::right ios::internal los::sklpws 0 ios::skipws Устанавливает основание системы счисления в щестнадцатеричное Устанавливает основание системы счисления в восьмеричное Устанавливает основание системы счисления в десятичное (по умолчанию) Отображает вещественные числа в десятичной форме Отображает вещественные числа в экспоненциальной форме Вставляя символы-заполнители после последнего выведенного значения, выравнивает по левому краю следующий аргумент Вставляя символы-заполнители перед выводимым в поток значением, выравнивает по правому краю следующий аргумент Добавляет символы-заполнители после начального знака или указателя системы счисления, но перед выводимым значением При вводе пробелы и знаки табуляции не пропускаются При вводе пробелы и знаки табуляции пропускаются (по умолчанию) Все операции ввода-вывода потокового объекта прерываются, если его код состояния ошибки не равен нулю. Пользователи могут проверить состояние ошибки потокового объекта с помощью функции iosr.badvinH ios::fail, а также с помощью перегруженной операции ! . Покажем, как это делается: if (!cin II Icout) cerr I/O error detected ; if (!(cout x) II x<0) cout.clear(ios::badbit if (cout.failO) clog cout fails\n ; cout.rdstateO ); Состояние ошибки потокового объекта можно сбросить с помощью функции iosr.clear. if (!cin) cin.clearO; Помимо обработки состояний ошибки, класс ios используется также для установки параметров форматирования данных потоковых объектов. Причем он обладает такими же широкими возможностями по форматированию данных, как и функции класса printf в языке С. Пример программы демонстрирует использование функций ios: II source module: ios.С finclude <iostream.h> int main 0 ( int X = 1024; double y= 200.0; static char str[80] = Hello ; cout.setf( ios::showbase ios::showpos ios::uppercase ); cout. setf ( ios ::scientific, ios :,: floatfield ); cout.precision(8); cout ; cout.width(10); cout.filK*); cout x << y= у \n ; cout ; cout.width(7); cout.setf(ios::left,ios::adjustfield); cout.setf(ios::fixed, ios::floatfield ); cout << x , y= << у \n ; cout ; cout.width (8).; cout.setf(ios::right,ios::adjustfield); cout str << Xn ; return 0; В этом примере функции ios:setf (ios..scientific, ios::floatfiield) и iosr.preci-sion(8) устанавливают формат отображения данных с плавающей запятой в экспоненциальном представлении с точностью до восьми знаков. С другой стороны, оператор iosr.setf (ios: fixed, ios::floatfield) устанавливает формат отображения чисел с плавающей запятой как чисел с фиксированной запятой. Обратите внимание, что значение однажды установленного формата объекта остается неизменным до тех пор, пока его не отменит следующий вызов ios::setf. Остальная, не описанная здесь часть примера достаточно очевидна. Компиляция и пробное выполнение этой программы дают следующие результаты: % СС ios.с -о ios; ios *****+1024, у=+2.00000000Е+02 +1024**, у=+200.00000000 ***Не11о 3.2. Манипуляторы Манипулятор - это функция, которую можно включить в операции потокового ввода-вывода для выполнения каких-то особых действий. Например, манипулятор flush обычно применяется при работе с объектами класса ostream с целью принудительного сбрасывания содержащихся в них буферизованных данных: cout << А big day << flush; Простой манипулятор - это функция, которая принимает аргумент istreamdc или ostreamdc, совершает какие-либо операции с объектом и возвращает ссылку на него. Следующий пример демонстрирует определения двух манипуляторов: tab и fld. Манипулятор tab вставляет знак табуляции в поток вывода, а манипулятор fld устанавливает для выводимых целочисленных данных восьмеричный формат представления с префиксом О. При этом минимальная ширина поля для отображения значения равна 10: ostreams tab (ostreams os) < I return OS \t; I ostreams fld(ostreamS os) { OS.setf(ios::showbase, ios::showbase) OS . setf (ios::oct, ios::basefield); OS.width(10); return os; Приведенные ниже операторы показывают, как использук)тся манипуляторы: int X = 50, у = 234; cout << fld X << tab у \n; В заголовке <iomanip.h> объявляется набор системных манипуляторов, которые обычно используются с объектами потоковых классов. Ниже приведены некоторые из них. Манипулятор Функция flush setw(int width) resetiosflags(long bitFlag), setiosflags(long bitFlag) setprecision{int p) Принудительно сбрасывает буферизованные данные в поток вывода Устанавливает минимальную ширину поля при выводе следующего значения и максимальный размер буфера (width-1) при вводе следующей строки символов Сбрасывает или устанавливает указанные биты формата в коде, определяющем существующий формат потока Устанавливает для следующего подлежащего выводу вещественного числа точность представления, равную /; знаков после запятой Ниже показано, как используются некоторых из упомянутых системных манипуляторов: cout X setw(5) у flush; принудительное сбрасывание cout cin resetiosflags (ios: :s)<ipws) /* пробелы и знаки табуляции не пропускаются */ setiosflags(ios:skipws); /* пропускать пробелы и знаки табуляции */ cout setprecision (8) << Dval; /* установить указанную точность представления чисел (в данном случае 8) */ 3.3. Классы ввода-вывода файлов в заголовке <fstream.h> объявляются классы ifstream, ofstream и fstream, предназначенные для манипулирования файлами. По сюим функциональным возможностям они аналогичны С-фуьгкциям, предназначенным для работы с файлами fopen, fread, fwrite, fclose и т.д. В частности, класс ifstream является производным от класса istream и дает пользователям возможность доступа к файлам и чтения из них данных. Класс ofstream, производный от класса ostream, обеспечивает возможность доступа и записи данных в файлы. И, наконец, класс fstream, производный от обоих этих классов (ifstream и ostream), дает пользователям возможность доступа к файлам как для ввода, так и для выюда данных. Конструкторы классов ifstream и ofstream определяются в заголовке <fstream.h> следующим образом: ifstream::ifstream(); ifstream::ifstream( const char* name, int open mode=ios::in, int port=filebuf::openprot/* 0644 */); ofstream::ofstream(); ofstream::ofstream( const char* name, int open mode=ios::out, int prot = filebuf::openprot); Возможные значения аргумента openmode приведены ниже./ Значение Смысл los::in Открывает файл для чтения jos::out Открывает файл для записи ios::app Добавляет новые данные в конец файла. Активизирует режим ios::out ios::ate После открытия файла указатель перемещается в конец файла. Режим ios::out должен устанавливаты;я непосредственно ios::nocreate Возвращает ошибку, если файл не существует ios::noreplace Возвращает ошибку, если файл уже существует ios::trunc Если файл существует, усекает его предыдущее содержимое. Этот режим подразумевается при открытии файла в режиме /о5.:ом/,г если только последний не установлен совместно с ios:.app илиа iosr.ate Аргумент prot задает права доступа по умолчанию, назначаемые файлу, если он создается функцией-конструктором. Значение по умолчанию file-bufr.openprot равно 0644. Это значит, что владелец файла может его читать и модифицировать, а остальные пользователи - только читать. Данное значение аргумента не используется, если файл, открываемый конструктором, уже существует. Как используются классы ifstream и ofstream показано на следующем примере. Здесь файл с именем from открывается для чтения, а другой файл, с именем to, открывается для записи. Если оба файла открыты успешно, то содержимое файла from копируется в содержимое файла to. Если какой-либо из файлов не может быть успешно открыт, то выводится сообщение об ошибке: ifstream source ( from ); ofstream target( to ); if (!source !target) cerr Error: File from or to open failed\n ; else for (char c=0; target && source.get(c);) target.put(c); Кроме функций-членов, унаследованных от класса iostream, классы ifstream, ofstream и fstream определяют также собственные специфические функции. Функция void open(const char* fname, int mode, int prot=openprot) void close() void attach(int fd) filebuf* rdbufO Смысл Открывает файл и присоединяет его к потоковому объекту Отсоединяет файл от потокового объекта и закрывает его Прикрепляет потоковый объект к файлу, обозначенному дескриптором fd Возвращает указатель на массив fdebuf, связанный с потоковым объектом > Ниже дана простая программа, которая демонстрирует использование I функций open, close и attach, уникальных для классов fstream: \finclude <iostream.h> finclude <fstream.h> iint main (int argc, char *argv[]) { ifstream source; if (argc == 1 II *argv[l] == -) source.attach(0); присоединить к stdin else source.open(argv[l], ios::in); if (source.rdbuf0 - >is open) source.close 0 закрыть файл, если он открыт Наконец, произвольный ввод-вывод файлов можно осуществлять с помощью функций seekg и tellg, унаследованных классами fstream от классов iostream. Использование этих функций иллюстрируется на примере следующих операторов: fstream tmp ( foo ,ios::inios::out); streampos pos = tmp. tellg () ;,jgj запомнить положение файла tmp.seekg(pos); tmp.seekg(-10, ios::end); tmp.seekg(0, ios::beg); tmp.seekg(20, ios::cur); вернуться к предыдущему положению сместиться на 10 байтов к началу файла перейти к началу файла передвинуться на 20 байтов вперед 3.4. Классы strstream в заголовке <strstream.h> объявляются классы istrstream, ostrstream и strstream, предназначенные для форматирования данных, находящихся в оперативной памяти. Эти классы содержат функции, эквивалентные библиотечным функциям sprintfvL sscanf языка С. Преимущество использования этих классов по сравнению с вышеуказанными функциями С заключается в том, что они могут быть перегружены для работы с классами, определяемыми пользователем. Они дают также возможность компилятору С++ контролировать типы фактических параметров программ во время компиляции. Класс istrstream является производным от класса istream и дает возможность пользователям извлекать отформатированные данные из буфера символов. Класс ostrstream - производный от класса ostream. Он позволяет помещать отформатированные данные в буфер символов. Наконец, класс strstream является производным от обоих классов, istrstream и ostrstream. С его помощью можно извлекать и вставлять отформатированные данные, используя буфер символов. Глава 3. Классы потоков ввода-вывода языка С++ uft
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |