Программирование на языке 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.

Похожие статьи: