Книга содержит информацию о библиотеке классов MFC (Microsoft Foundation Classes) и методах создания Windows-приложений на основе классов этой библиотеки. Сведения, изложенные в этой книге, собраны автором исключительно на основе изучения и анализа исходных кодов MFC. Для программистов.
При необходимости зона, а соответственно, и буфер, динамически увеличивают свои размеры, но при этом всегда размер буфера больше или, по крайней мере, равен размеру зоны файла. Схематично устройство файла в памяти представлено на рисунке выше. Зона файла на рисунке затенена. Заштрихованная часть зоны файла представляет собой расстояние от начала файла или, что то же самое, от начала файла, до текущей позиции файла. При работе с файлом в памяти программист не задумывается о буфере и зоне, для работы с файлом в памяти используются привычные методы . С точки зрения программиста единственным отличием файла в памяти от файла на диске является то, что файл в памяти не имеет имени . Естественно, что файл в памяти существует до тех пор, пока программа может управлять памятью. При потере указателя на блок памяти, разрушении по какой. Первый из них в некотором смысле можно назвать конструктором . Исходный код его находится в файле . В таком случае естественным выглядит и то, что значение длины файла, т. Этот конструктор может быть использован в тех случаях, когда в момент вызова конструкторабуфер в памяти еще не выделен или же конструктор не может получить адрес этого буфера. Исходный код второго конструктора тоже находится в файле . При открытии указатель файла устанавливается в начало файла. Обратите внимание на то, каким образом устанавливается размер файла. Если при вызове конструктора мы указали, что . Стоит указать ненулевое приращение нулевым будет размер файла. Кстати, по умолчанию размер приращения при использовании этого конструктора равен нулю. Возможно, это связано с механизмом выделения дополнительной памяти буферу. Таким образом, мы практически полностью опреде. Код метода полностью совпадает с кодом второго конструктора. Разница между ними в том, что при вызове конструктора создается объект класса, к которому принадлежи. Следовательно, в отличие от вызова конструктора, при вызове метода . Для того чтобы . Его исходный код находится в файле . Этот указатель в дальнейшем может быть использован другими фрагментами программы. Динамическое изменение размеров файла и буфера Думаю, читатель вправе задать мне сейчас вопрос а каким образом осуществляется увеличение размера файла. Но перед этим я хотел бы остановиться еще на двух методах, которые обеспечивают управление памятью. Исходный код метода А. Метод осуществляет выделение блока памяти указанной длины при помощи функции . Исходный код метода . Метод осуществляет изменение длины файла, используя для этого функцию . Вернемся к методу . Исходный код этого метода находится в файле . Как следует из текста, метод будет отрабатывать толь. Кроме того, вспомните мое предположение о том, что, указываемый в конструкторе размер приращения определяет механизм выделения дополнительной памяти буферу. Но допустим, все прошло нормально. В таком случае метод определяет размер требуемого буфера. Как только размер требуемого буфера определен, метод пытается вьщелить требуемый блок памяти. При этом если у объекта еще не было ассоциированного с ним буфера, то метод пытается выделить буфер при помощи метода А. Если же у объекта был ассоциированный буфер, то метод использует для выделения памяти метод . Если память по каким. Если же все прошло нормально, то тогда метод корректирует указатель на буфер и значение длины буфера. Если оставить все детали, то можно сказать, что метод . Еще одним методом, влияющим на длины буфера и зоны, является метод . Его исходный код находится в файле . В случае, если длина файла превышает размер буфера, то тогда при помощи метода . В противном случае длина файла делается равной зна. Обратите внимание, уважаемый читатель, что никакого перераспределения памяти при этом не происходит. Указатель файла в том случае, если его значение оказывается превышающим новый размер файла, устанавливается на конец файла новой длины. Все легко и просто. При этом копирование происходит при помощи функции . Как мне представляется, этот метод является вспомогательным и предназначен прежде всего для обеспечения нормальной работы методов . В случае, если число считываемых байтов равно нулю, метод немедленно возвращает нуль. Если число байтов от указателя файла до конца файла превышает или равно числу подлежащих считыванию байтов, то будет осуществлена попытка считать указанное количество байтов. В противном случае считываться будут только байты, находящиеся между указателем файла и концом файла. Метод возвращает число успешно считанных байтов. Исходный код метода находится в файле . размер файла динамически увеличивается. Перед тем как завершить рассмотрение класса . Обращение к ним немедленно приводит к выработке исключения. СЕРИАЛИЗАЦИЯ И АРХИВЫ Иногда программе может потребоваться сохранить данные, сформированные в каком. Такими устройствами могут быть дискета, винчестер, компакт. При этом программа должен обеспечить сохранение текущего состояния совокупности своих объектов таким образом, чтобы затем, при повторном запуске программы, текущее состояние объектов могло бы быть полностью восстановлено. Совокупность действий, обеспечивающих, с одной стороны, сохранение текущих данных в форме, позволяющей последующее восстановление, и, с другой стороны, непосредственно восстановление текущего состояния данных, называется сериализацией. Для того чтобы реализовать сериализацию, можно пойти привычным путем в программе создать файл, затем при помощи стандартных операций записи в файл . Но дело в том, что программе придется работать не с объектами, а с некоторыми блоками памяти или, на худой конец, со строками. Все будет работать нормально, но каждый раз придется считать, какую переменную куда записать, помнить о формате записанной информации. В каждой программе разработать методы, реализующие сериализацию для каждого конкретного класса. Можно при этом использовать уже имеющиеся в языках средства для записи данных в файл. Но я не зря выше употребил слово . Дело в том, что .