

Программирование на языке MFC
Мой второй блог в серии программирования
Что происходит при работе конструктора?
Итак, что же происходит при работе конструктора? Естественно, инициализируются все поля объекта. Мы можем заметить, что поле m_nMode хранит режим работы архива, в поле m_pFile сохраняется указатель на объект класса CFile, на основе которого создан архив. Назначение остальных полей, надеюсь, мы поймем чуть позже. Обратите внимание, читатель, что среди инициализируемых полей есть поле m_bUserBuf, которому присваивается значение TRUE.
В том случае, если длина буфера, переданного конструктору, окажется менее 128 байтов, конструктор не будет использовать переданный ему буфер и сделает указатель на буфер равным NULL, а длину буфера сделает равной 128 байтам. Длина буфера сохраняется в поле m_nBufSize. После этого, в том случае, если указатель на буфер оказался равным NULL (например, при вызове конструктора использовался указатель по умолчанию или указанный при вызове конструктора размер буфера был меньше 128 байтов), то конструктор выделяет новый буфер требуемого размера, записывает указатель на буфер в поле mJpBufferStart и… Нам становится понятно назначение еще одного поля! Поле m_bUserBuf является флагом. Значение TRUE этого поля определяет, что объект будет использовать ранее подготовленный буфер, значение FALSE говорит о том, что буфер, используемый объектом, был создан во время работы конструктора. Естественно, в том случае, когда конструктор самостоятельно выделяет буфер для работы, значение этого поля делается равным FALSE.
После того как все указатели проинициализированы, определяется указатель на конец буфера. Этот указатель хранится в поле mJpBufMax. Но возникает вопрос – а зачем нам необходимо хранить две величины, фактически определяющие размер буфера – поле mjiBufSize и поле mJpBufSize? Вопрос закономерен, то отвечу я на него немного позже, ОК?
А затем происходит одна интересная вещь. Указатель на текущую позицию буфера (поле mJpBufCur) в том случае, если происходит чтение из архива, устанавливается на конец буфера. В случае, если происходит запись в архив, указатель устанавливается на начало буфера. Это, разумеется, не означает, что чтение или запись будут производиться в обратном порядке. Нет, конечно, все гораздо проще. Если при операции чтения из архива в буфер указатель на текущую позицию буфера достигает конца буфера, это означает, что буфер заполнен, читать больше некуда, и необходимо произвести некоторые действия для того, чтобы буфер можно было бы использовать повторно. Аналогично, если при записи из буфера в архив указатель на начало файла и на текущее позицию в буфере совпадают, то это означает, что все данные из буфера уже «сброшены» в архив и что опять-таки необходимо произвести некоторые действия для того, чтобы заполнить буфер. Другими словами, положение указателя является своеобразным флагом, вынуждающим метод произвести подготовку буфера к считыванию данных из архива или записи данных в архив.
Запись в архив и чтение из архива больших объемов информации производится при помощи перегруженных операторов ««» и «»». В классе CArchive мы можем найти перегруженные операции для чтения из архива и записи в архив переменных типа WORD, DWORD, float, double. Помимо этого предусмотрены операции записи в архив и чтения из архива строк. Для того, чтобы понять, как происходит чтение из архива и запись в архив примитивов, рассмотрим, каким образом осуществляется запись в архив и чтение из архива переменной типа WORD.
Похожие статьи: Что происходит при работе конструктора?
