Функции для работы с памятью. 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Функции для работы с памятью.



В заголовочном файле 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++

Имя Класс Описание
cin istream Ассоциируется со стандартным вводом (клавиатурой).
cout ostream Ассоциируется со стандартным выводом (экраном).
cerr ostream Ассоциируется со стандартным устройством ошибок (экраном) без буферизации.
clog ostream Ассоциируется со стандартным устройством ошибок (экраном)с буферизацией.

 

Основными классами ввода-вывода C++ являются istream и ostream. Первый из них перегружает операцию правого сдвига (>>), которая служит в нем для ввода данных и называется операцией извлечения из потока. Класс ostream перегружает соответственно операцию левого сдвига (<<); она применяется для вывода и называется операцией передачи в поток.

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

Состояние объекта класса ios (и производных от него) содержится в его закрытом элементе _state в виде набора битов, представленных в таблице 27.2.

 

Таблица 27.2 - Биты состояния потока

Бит Описание
goodbit С потоком все в порядке (на самом деле это не какой-то бит, а 0 — отсутствие битов ошибки).
eofbit Показывает, что достигнут конец файла.
failbit Индицирует ошибку формата или преобразования. После очистки данного бита работа с потоком может быть продолжена.
badbit Индицирует серьезную ошибку потока, связанную обычно с буферными операциями или аппаратурой. Скорее всего, поток далее использовать невозможно.

 

Для опроса или изменения состояния потока в классе 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 для режимов открытия файла

Константа Описание
арр Открытие для записи в конец файла.
ate При открытии позиционирует указатель на конец файла. binary Файл открывается в двоичном (не текстовом) режиме.
in Файл открывается для ввода.
out Файл открывается для вывода.
trunc Если файл существует, его содержимое теряется.

 

Константы можно комбинировать с помощью поразрядного 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; просмотров: 117; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.127.232 (0.021 с.)