Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Функции для работы с памятью.Содержание книги
Поиск на нашем сайте В заголовочном файле string.h описаны также функции для работы с блоками памяти, которые аналогичны соответствующим функциям для работы со строками. Функция void* memchr (const void *str, int c, size_t n); ищет первое вхождение символа, заданного параметром c, в n байтах строки str. Функция int memcmp (const void *str1, const void *str2, size_t n); сравнивает первые n байт строк str1 и str2. Функция void* memcpy (const void *str1, const void *str2, size_t n); копирует первые n байт из строки str1 в строку str2. Функция void* memmove(const void *str1, const void *str2, size_t n); копирует первые n байт из строки str1 в строку str2, обеспечивая корректную обработку перекрывающихся строк. Функция void* memset (const void *str, int c, size_t n); копирует символ, заданный параметром c, в первые n байтов строки str. Потоки ввода-вывода В C++ существует несколько классов потоков: - Класс streambuf управляет буфером потока, обеспечивая базовые операции заполнения, опорожнения, сброса и прочих манипуляций с буфером. - Класс ios является базовым классом потоков ввода-вывода. - Классы istream и ostream – производные от ios и обеспечивают работу потоков соответственно ввода и вывода. - Класс iostream является производным от двух предыдущих и предусматривает функции, как для ввода, так и для вывода. - Классы ifstream, ofstream и fstream предназначены для управления файловым вводом-выводом. - Классы istrstream и ostrstream управляют резидентными потоками (форматированием строк в памяти). Для работы с потоками необходимо подключить заголовочный файл. Кроме того, может потребоваться подключить файлы (файловый ввод-вывод), (параметризованные манипуляторы) и (форматирование в памяти). Библиотека ввода-вывода C++ предусматривает четыре предопределенных объекта-потока, связанных со стандартными входным и выходным устройствами.
Таблица 27.1 Предопределенные объекты-потоки C++
Основными классами ввода-вывода C++ являются istream и ostream. Первый из них перегружает операцию правого сдвига (>>), которая служит в нем для ввода данных и называется операцией извлечения из потока. Класс ostream перегружает соответственно операцию левого сдвига (<<); она применяется для вывода и называется операцией передачи в поток. Библиотека ввода - вывода предусматривает три способа форматирования: посредством вызова форматирующих функций - элементов, с помощью манипуляторов или путем установки или сброса флагов потока. Состояние объекта класса ios (и производных от него) содержится в его закрытом элементе _state в виде набора битов, представленных в таблице 27.2.
Таблица 27.2 - Биты состояния потока
Для опроса или изменения состояния потока в классе ios имеется ряд функций и операций: - int rdstate(); Возвращает текущее состояние. - bool eof(); Возвращает true, если установлен eofbit. - bool good(); Возвращает true, если не установлен ни один из битов ошибки. - bool fail(); Возвращает true, если установлен failbit или badbit. - bool bad(); Возвращает true, если установлен badbit. - void clear(int = 0); Сбрасывает биты ошибки (по умолчанию) или устанавливает состояние потока в соответствии с аргументом. - void setstate(int); Устанавливает состояние битов ошибки с соответствии с аргументом. - operator void *(); Возвращает нулевой указатель, если установлен какой-либо из битов ошибки. - bool operator!(); Возвращает true, если установлен какой-либо из битов ошибки.
Файловые потоки Файловые потоки библиотеки ввода-вывода реализуют объектно-ориентированную методику работы с дисковыми файлами. Имеется три класса таких потоков: - ifstream специализирован для ввода из дисковых файлов. - ofstream специализирован для записи дисковых файлов. - fstream управляет как вводом, так и записью на диск. Эти классы выводятся соответственно из istream, ostream и iostream. Таким образом, они наследуют все их функциональные возможности (перегруженные операции ”<<” и ”>>” для встроенных типов, флаги форматирования и состояния, манипуляторы и т.д.). Чтобы работать с файловым потоком, нужен, во-первых, объект потока, а во-вторых, открытый файл, связанный с этим объектом. Каждый из трех классов файловых потоков имеет четыре конструктора. 1) Конструктор, создающий объект без открытия файла: - ifstream(); - ofstream(); - fstream(); 2) Конструктор, создающий объект, открывающий указанный файл и закрепляющий этот файл за потоком. Аргументами являются имя файла, режим открытия и режим защиты (в Windows не используется); - ifstream(const char *name, int mode=ios::in, long prot=0666); - ofstream(const char *name, int mode=ios::out, long prot=0666); - fstream(const char *name, int mode, long prot = 0666); 3) Конструктор, создающий объект и связывающий с ним уже открытый файл. В качестве аргумента передается дескриптор файла: - ifstream(int file); - ofstream(int file); - fstream(int file); 4) Конструктор, создающий объект и связывающий с ним уже открытый файл; объект ассоциируется указанным буфером: - ifstream(int file, char *buf, int len); - ofstream(int file, char *buf, int len); - fstream(int file, char *buf, int len); При использовании конструктора, создающего объект без открытия файла, необходимо дополнительно вызвать метод open(), который позволяет открыть файл с удобным для нас вариантом задания параметров.
Режимы открытия файла Параметр mode, который имеет вторая форма конструктора, задает режим открытия файла. Для значений параметра класс ios определяет символические константы, перечисленные в таблице 27.3.
Таблица 27.3. Константы класса ios для режимов открытия файла
Константы можно комбинировать с помощью поразрядного OR. Для конструкторов классов ifstream и ofstream параметр mode имеет значения по умолчанию – соответственно ios::in и ios::out.
Закрытие файла В классах файловых потоков имеется функция close(), которая сбрасывает содержимое потока и закрывает ассоциированный с ним файл. Кроме того, деструктор потока автоматически закрывает файл при уничтожении объекта потока. При ошибке закрытия файла устанавливается флаг failbit.
Двоичный режим ввода-вывода Операций извлечения/передачи данных перегружены для всех встроенных типов и выполняют соответствующие преобразования из внутреннего представления данных в текстовое и из текстового во внутреннее (машинное). Однако в библиотеке C++ имеется немало функций бесформатного ввода-вывода, которые часто применяют для чтения и записи двоичных (не-текстовых) файлов. Двоичный режим открытия файла (с установленным битом binary) означает, что никакой трансляции данных при передаче из файла в поток и обратно производиться не будет. Речь здесь идет не о форматных преобразованиях представления данных. При текстовом режиме (он принимается по умолчанию) при передаче данных между файлом и потоком производится замена пар символов CR/LF на единственный символ LF ('\n') и наоборот. Это происходит до преобразований представления, которые выполняются операциями извлечения/передачи. Двоичный ввод-вывод означает всего-навсего, что такой замены происходить не будет; тем не менее двоичный режим необходим при работе с сырыми данными, т. е. данными в машинной форме без преобразования их в текстовый формат. Чтобы открыть файл в двоичном режиме, нужно, установить в параметре mode конструктора потока или функции open() бит ios::binary. Чтение сырых данных производится функцией read() класса istream: istream &read(char *buf, long len); Здесь buf – адрес буфера, в который будут читаться данные, а len – число символов, которые нужно прочитать. Запись сырых данных производится функцией write() класса ostream. Она выглядит точно так же, как функция read(): ostream &write(char *buf, long len); Здесь buf – адрес буфера, в котором содержатся данные, а len – число символов, которые должны быть записаны в поток. Обе функции возвращают ссылку на свой объект-поток. Это означает, что возможны их цепные вызовы, т. е. выражения вида: ostream os(...); os.write(...).write(...).write(...);
Чтение символов и строк Для чтения одиночных символов, а также строк применяется функция get класса istream. Эта функция перегружена следующим образом: int get(); istream &get(char &c); istream &get(char *buf, long len, char t = '\n'); Две первые формы функции предназначены для извлечения из потока одиночного символа. Функция int get() возвращает символ в качестве своего значения. Функция get (char &c) передает символ в параметре и возвращает ссылку на свой поток.
|
|||||||||||||||||||||||||||||||||||||||
|
Последнее изменение этой страницы: 2021-02-07; просмотров: 279; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.216.11 (0.009 с.) |