Шаг 131 - Знакомимся CMemFile

Класс CMemFile хорош тем, что позволяет Вам создавать файл точную копию дискового файла в смысле работы и функционирования в оперативной памяти, что позволяет значительно увеличить скорость работы. Давайте попробуем. Создадим приложение MFC AppWizard на основе диалогового окна и одной кнопки. По нажатию на неё будет создаваться файл, потом в него записываться и считываться информация. Этот класс унаследован от CFile. Вы вдумайтесь в смысл. Это очень хороший способ использования оперативной памяти. Никаких проблемм !!! типа Read или Write или Seek без размера. Круто !!!

void CTestMemDlg::OnButton1() 
{
	CMemFile cm(1024);
	char buffer[100];
	strcpy(buffer,"Hello MemFile");
	cm.Write(buffer,sizeof(buffer));
	cm.Read(buffer,sizeof(buffer));
	AfxMessageBox(buffer);
	cm.Close(); 
}
Все начинается с конструктора. Их у него несколько.
CMemFile( UINT nGrowBytes = 1024 ); 					// начальный размер
CMemFile( BYTE* lpBuffer, UINT nBufferSize, UINT nGrowBytes = 0 );	// на основе буфера
Файл автоматически открывается и поэтому использовать Open не нужно. Что будет происходить при записи в файл ?? Выделиться память стандартными средсвами, если памяти не хватит она увеличится на тот размер, который Вы установили. Выделенная память автоматически вернется системе после удаления объекта CMemFile. Второй вид конструктора немного сложнее. Вы сами выделяете память и передаете её для использования по типу файловых операций. Это тоже может быть удобно, только вся ответственость за память ляжет на Вас. Есть функции
	Attach
	Detach
Они позволяют динамично разрешать и запрешать доступ к данному файлу. Вот еще пример с использованием Seek.
void CTestMemDlg::OnButton1() 
{
	CMemFile cm(1024);
	char buffer[100];
	char buffer2[20];
	strcpy(buffer,"Hello MemFile");
	strcpy(buffer2,"Hello Buffer 2");
	cm.Write(buffer,sizeof(buffer));
	cm.Write(buffer2,sizeof(buffer2));
	cm.Read(buffer,sizeof(buffer));
	AfxMessageBox(buffer);
	cm.Read(buffer2,sizeof(buffer2));
	AfxMessageBox(buffer2);
	cm.SeekToBegin(); 
        cm.Read(buffer2,sizeof(buffer2));
	AfxMessageBox(buffer2);
	cm.Close(); 
}

Смотрите SeekToBegin устанавливает указатель в начало и потом зачитывает данные уже в buffer2 работает как с файлом.


Загрузить проект | Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.