CMemFile Sınıfı
Bellek dosyalarını destekleyen CFile türetilmiş sınıfı.
Sözdizimi
class CMemFile : public CFile
Üyeler
Ortak Oluşturucular
Ad | Tanım |
---|---|
CMemFile::CMemFile | Bir bellek dosyası nesnesi oluşturur. |
Genel Yöntemler
Ad | Tanım |
---|---|
CMemFile::Attach | öğesine bir bellek CMemFile bloğu ekler. |
CMemFile::D etach | Bellek bloğunu'ndan CMemFile ayırır ve ayrılan bellek bloğuna bir işaretçi döndürür. |
CMemFile::GetBufferPtr | Bellek dosyasını destekleyen bellek arabelleğine alma veya yazma. |
Korumalı Yöntemler
Ad | Tanım |
---|---|
CMemFile::Alloc | Bellek ayırma davranışını değiştirmek için geçersiz kılın. |
CMemFile::Free | Bellek ayırma davranışını değiştirmek için geçersiz kılın. |
CMemFile::GrowFile | Dosyayı büyütürken davranışı değiştirmek için geçersiz kılın. |
CMemFile::Memcpy | Dosyaları okurken ve yazarken bellek kopyalama davranışını değiştirmek için geçersiz kılın. |
CMemFile::Realloc | Bellek yeniden konumlandırma davranışını değiştirmek için geçersiz kılın. |
Açıklamalar
Bu bellek dosyaları, dosyanın disk yerine RAM'de depolanması dışında disk dosyaları gibi davranır. Bellek dosyası şunlar için kullanışlıdır:
- hızlı geçici depolama
- bağımsız işlemler arasında ham bayt aktarma
- serileştirilmiş nesneleri bağımsız işlemler arasında aktarma
CMemFile
nesneleri kendi belleklerini otomatik olarak ayırabilir. Alternatif olarak, Ekle'yi çağırarak nesneye CMemFile
kendi bellek bloğunuzu ekleyebilirsiniz. Her iki durumda da, bellek dosyasının otomatik olarak büyütüldüğünü belirten bellek, sıfır değilse nGrowBytes
boyutlu artışlarla ayrılırnGrowBytes
.
Bellek başlangıçta nesne tarafından CMemFile
ayrılmışsa, nesne yok CMemFile
edildikten sonra bellek bloğu otomatik olarak silinir; aksi takdirde, nesneye eklediğiniz belleği serbest bırakma sorumluluğunuz olur.
Ayır'ı çağırarak nesneden ayırdığınızda sağlanan işaretçi aracılığıyla bellek bloğuna CMemFile
erişebilirsiniz.
en yaygın kullanımıCMemFile
, bir CMemFile
nesne oluşturmak ve CFile üye işlevlerini çağırarak kullanmaktır. CMemFile
Oluşturma işlemi otomatik olarak açar: Yalnızca disk dosyaları için kullanılan CFile::Open çağrısını yapamazsınız. Disk CMemFile
dosyası kullanmadığından veri üyesi CFile::m_hFile
kullanılmaz.
CFile
Yinelenen, LockRange ve UnlockRange üye işlevleri için CMemFile
uygulanmaz. Bir nesnede CMemFile
bu işlevleri çağırırsanız CNotSupportedException alırsınız.
CMemFile
, bellek ayırmak, yeniden dağıtmak ve serbest bırakmak için malloc, realloc ve free çalışma zamanı kitaplığı işlevlerini ve okuma ve yazma sırasında kopyalama belleğini engellemek için iç memcpy'yi kullanır. Bu davranışı veya dosyayı büyüttüğünde CMemFile
davranışı değiştirmek isterseniz, kendi sınıfınızı CMemFile
türetin ve uygun işlevleri geçersiz kılın.
hakkında CMemFile
daha fazla bilgi için MFC'deki dosyalar ve Bellek Yönetimi (MFC) makalelerine bakın ve Çalışma Zamanı Kitaplığı Başvurusu'nda Dosya İşleme bölümüne bakın.
Devralma Hiyerarşisi
CMemFile
Gereksinimler
Üst bilgi: afx.h
CMemFile::Alloc
Bu işlev üye işlevleri tarafından CMemFile
çağrılır.
virtual BYTE* Alloc(SIZE_T nBytes);
Parametreler
nBayt
Ayrılacak bellek bayt sayısı.
İade Değeri
Ayrılan bellek bloğunun işaretçisi veya ayırma başarısız olursa NULL.
Açıklamalar
Özel bellek ayırmayı uygulamak için bu işlevi geçersiz kılın. Bu işlevi geçersiz kılarsanız, büyük olasılıkla Free ve Realloc'un da geçersiz kılınmasını istersiniz.
Varsayılan uygulama, bellek ayırmak için çalışma zamanı kitaplığı işlevi malloc'u kullanır.
CMemFile::Attach
öğesine bir bellek bloğu eklemek için CMemFile
bu işlevi çağırın.
void Attach(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parametreler
lpBuffer
öğesine eklenecek arabelleğe ilişkin CMemFile
işaretçi.
nBufferSize
Arabellek boyutunu bayt cinsinden belirten bir tamsayı.
nGrowBytes
Bellek ayırma bayt cinsinden artar.
Açıklamalar
Bu, bellek dosyası olarak bellek bloğunun kullanılmasına neden olur CMemFile
.
nGrowBytes 0 ise, CMemFile
dosya uzunluğunu nBufferSize olarak ayarlar. Bu, bellek bloğundaki verilerin eklenmeden CMemFile
önce dosya olarak kullanılacağı anlamına gelir. Bu şekilde oluşturulan bellek dosyaları büyütülemiyor.
Dosya büyütülemediğinden, dosyayı büyütmeye çalışmamaya dikkat edin CMemFile
. Örneğin, sonuna kadar yazmak için CFile:Write geçersiz kılmalarını çağırmayın CMemFile
veya nBufferSize değerinden uzun bir uzunlukla CFile:SetLength çağrısı yapmayın.
nGrowBytes değeri 0'dan büyükse, CMemFile
eklediğiniz bellek bloğunun içeriğini yoksayar. geçersiz kılmayı CFile::Write
kullanarak CMemFile
bellek dosyasının içeriğini sıfırdan yazmanız gerekir. dosyanın sonunu yazmayı denerseniz veya geçersiz kılmayı CFile::SetLength
CMemFile
çağırarak CMemFile
dosyayı büyütürseniz, bellek ayırması nGrowBytes artırımlarıyla artar. Geçirdiğiniz Attach
bellek bloğu Alloc ile uyumlu bir yöntemle ayrılmadıysa bellek ayırmayı büyütme işlemi başarısız olur. varsayılan uygulamasıyla Alloc
uyumlu olmak için, belleği çalışma zamanı kitaplığı işlevi malloc veya calloc ile ayırmanız gerekir.
CMemFile::CMemFile
İlk aşırı yükleme boş bir bellek dosyası açar.
CMemFile(UINT nGrowBytes = 1024);
CMemFile(
BYTE* lpBuffer,
UINT nBufferSize,
UINT nGrowBytes = 0);
Parametreler
nGrowBytes
Bellek ayırma bayt cinsinden artar.
lpBuffer nBufferSize boyutunun bilgilerini alan bir arabelleğe işaretçi.
nBufferSize
Dosya arabelleğinin boyutunu bayt cinsinden belirten bir tamsayı.
Açıklamalar
Dosya oluşturucu tarafından açılır. CFile::Open çağrısı yapmayın.
İkinci aşırı yükleme, ilk oluşturucuyu kullandıysanız ve hemen aynı parametrelerle Ekle olarak adlandırılırsa aynı şekilde davranır. Ayrıntılar için bkz Attach
.
Örnek
CMemFile f; // Ready to use - no Open necessary.
BYTE * pBuf = (BYTE *)new char [1024];
CMemFile g(pBuf, 1024, 256);
// same as CMemFile g; g.Attach(pBuf, 1024, 256);
CMemFile::D etach
tarafından CMemFile
kullanılan bellek bloğuna bir işaretçi almak için bu işlevi çağırın.
BYTE* Detach();
İade Değeri
Bellek dosyasının içeriğini içeren bellek bloğu işaretçisi.
Açıklamalar
Bu işlevi çağırmak da kapatır CMemFile
. Ekle'yi çağırarak bellek bloğunu 'a CMemFile
yeniden ekleyebilirsiniz. Dosyayı yeniden eklemek ve içindeki verileri kullanmak istiyorsanız, çağırmadan önce Detach
dosyanın uzunluğunu almak için CFile::GetLength çağrısı yapmalısınız. Verilerini ( nGrowBytes
== 0) kullanabilmek için CMemFile
bir bellek bloğu eklerseniz, bellek dosyasını büyütemezsiniz.
CMemFile::Free
Bu işlev üye işlevleri tarafından CMemFile
çağrılır.
virtual void Free(BYTE* lpMem);
Parametreler
lpMem
Serbest bırakılacak belleğin işaretçisi.
Açıklamalar
Özel bellek ayırmayı uygulamak için bu işlevi geçersiz kılın. Bu işlevi geçersiz kılarsanız, muhtemelen Alloc ve Realloc'un da geçersiz kılınmasını istersiniz.
CMemFile::GetBufferPtr
Bellek dosyasını destekleyen bellek arabelleğine alma veya yazma.
virtual UINT GetBufferPtr(
UINT nCommand,
UINT nCount = 0,
void** ppBufStart = NULL,
void** ppBufMax = NULL
);
Parametreler
nKomand
Yürütülecek bufferCommand (bufferCheck
, bufferCommit
, bufferRead
veya bufferWrite
).
nCount
nCommand'a bağlı olarak, arabellekteki okuma, yazma veya işleme bayt sayısı. Arabellekten okurken, geçerli konumdan dosyanın sonuna bir arabellek döndürmek için -1 belirtin.
ppBufStart
[out] Arabelleğin başlangıcı. nCommand olduğunda bufferCommit
olmalıdırNULL
.
ppBufMax
[out] Arabelleğin sonu. nCommand olduğunda bufferCommit
olmalıdırNULL
.
İade Değeri
komut değeri | Dönüş değeri |
---|---|
buffercheck |
Doğrudan arabelleğe alma destekleniyorsa bufferDirect değerini döndürür, aksi takdirde 0 döndürür. |
bufferCommit |
Döndürür 0 |
bufferRead veya bufferWrite |
Döndürülen arabellek alanında bayt sayısını döndürür. ppBufStart ve ppBufMax , okuma/yazılı arabelleğin başlangıcını ve sonunu gösterir. |
Açıklamalar
Bellek arabelleğindeki (m_nPosition
) geçerli konum, nCommand'a bağlı olarak aşağıdaki yollarla gelişmiştir:
nKomand | arabellek konumu |
---|---|
bufferCommit |
Geçerli konum, işlenen arabelleğin boyutuna göre ilerler. |
bufferRead |
Geçerli konum, okuma arabelleğinin boyutuna göre ilerler. |
CMemFile::GrowFile
Bu işlev, üye işlevlerin birkaçı tarafından çağrılır CMemFile
.
virtual void GrowFile(SIZE_T dwNewLen);
Parametreler
dwNewLen
Bellek dosyasının yeni boyutu.
Açıklamalar
Dosyasının büyüme biçimini CMemFile
değiştirmek istiyorsanız, dosyayı geçersiz kılabilirsiniz. Varsayılan uygulama, var olan bir bloğu büyütmek (veya bellek bloğu oluşturmak için Ayırma) için Realloc'u çağırır ve oluşturucuda belirtilen değerin nGrowBytes
katlarına bellek ayırır veya Çağrı ekle'yi kullanır.
CMemFile::Memcpy
Bu işlev, bellek dosyasına ve bellek dosyasından CMemFile
veri aktarmak için CFile::Read ve CFile::Write geçersiz kılmaları tarafından çağrılır.
virtual BYTE* Memcpy(
BYTE* lpMemTarget,
const BYTE* lpMemSource,
SIZE_T nBytes);
Parametreler
lpMemTarget
Kaynak belleğin kopyalanacağı bellek bloğunun işaretçisi.
lpMemSource
Kaynak bellek bloğu işaretçisi.
nBayt
Kopyalanacak bayt sayısı.
İade Değeri
lpMemTarget kopyası.
Açıklamalar
Bu bellek kopyalarını nasıl gerçekleştireceğini CMemFile
değiştirmek istiyorsanız bu işlevi geçersiz kılın.
CMemFile::Realloc
Bu işlev üye işlevleri tarafından CMemFile
çağrılır.
virtual BYTE* Realloc(
BYTE* lpMem,
SIZE_T nBytes);
Parametreler
lpMem
Yeniden taşınacak bellek bloğuna bir işaretçi.
nBayt
Bellek bloğu için yeni boyut.
İade Değeri
Yeniden ayrılan (ve büyük olasılıkla taşınan) bellek bloğunun işaretçisi veya yeniden ayırma başarısız olursa NULL.
Açıklamalar
Özel bellek yeniden ayırma uygulamak için bu işlevi geçersiz kılın. Bu işlevi geçersiz kılarsanız, muhtemelen Alloc ve Free'yi de geçersiz kılmak istersiniz.