Hi.
I have a class that load binary file. It has two methods for load the content of files: fread and mapping the file.
For read content of file with fread:
Code:
DWORD CGrafo::CargarGrafoBin(const CString &szNombre) {
    // El grafo binario tiene una cabecera de 256 bytes repartidos de la siguiente manera: 
    // Una estructura ENVOLVENTE (144 bytes)
    // Un unsigned __int32 para el número de Nodos (4 bytes)
    // Un unsigned __int32 para el número de Adyacentes (4 bytes)
    // El resto (104 bytes) lo dejamos a 0 para incorporar nuevas cosas a la cabecera.

    if(!PathFileExists(szNombre)) {
        return INVALIDINPUTBINFILE;
    }

    IniciarVacio();

    CFile fGrafo;
    BOOL bOpen = fGrafo.Open(szNombre, CFile::modeRead|CFile::shareDenyWrite);

    if(!bOpen) return CANNOTOPENBINFILE;

    BYTE bytesCabecera[256];
    memset(bytesCabecera, 0, 256);

    fGrafo.Read(bytesCabecera, 256);    

    nNumeroNodos = (unsigned __int32)(*((unsigned __int32 *)(&bytesCabecera[sizeof(ENVOLVENTE)])));
    nNumeroAdyacentes = (unsigned __int32)(*((unsigned __int32 *)(&bytesCabecera[sizeof(ENVOLVENTE) + sizeof(unsigned __int32)])));
    memcpy(&Envolvente, bytesCabecera, sizeof(ENVOLVENTE));
    
    Nodos = (NODO *) malloc(nNumeroNodos * sizeof(NODO));
    Adyacentes = (ADYACENTE *) malloc(nNumeroAdyacentes * sizeof(ADYACENTE));
    vOffsetAdyacentes = (unsigned __int32 *) malloc((nNumeroNodos + 1) * sizeof(unsigned __int32));

    fGrafo.Read(Nodos, nNumeroNodos * sizeof(NODO));
    fGrafo.Read(Adyacentes, nNumeroAdyacentes * sizeof(ADYACENTE));
    fGrafo.Read(vOffsetAdyacentes, (nNumeroNodos + 1) * sizeof(unsigned __int32));

    fGrafo.Close();    

    bMemNodos = true;
    bMemAdyacentes = true;
    bMemOffsetAdy = true;
    
    return OK;
}
For mapping the file:

Code:
DWORD CGrafo::CargarGrafoMap(const CString &szNombre) {
    if(!PathFileExists(szNombre)) {
        return INVALIDINPUTBINFILE;
    }
    
    hndFile = CreateFile(szNombre, FILE_READ_DATA|FILE_WRITE_DATA, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL ,NULL);    
    if(hndFile == INVALID_HANDLE_VALUE) return CANNOTOPENBINFILE;
    CString szMappedFileName = szNombre.Mid(szNombre.ReverseFind('\\') + 1, szNombre.GetLength());
    DWORD nSize = GetFileSize(hndFile, NULL);
    hndMappedFile = CreateFileMapping(hndFile, NULL, PAGE_READWRITE, 0, nSize, szMappedFileName);    
    if(hndMappedFile == INVALID_HANDLE_VALUE) return CANNOTCREATEMAPPEDFILE;
    bytView = (BYTE *) MapViewOfFile(hndMappedFile, FILE_MAP_READ|FILE_MAP_WRITE, 0, 0, nSize);    
    DWORD dwError = GetLastError();
    if(bytView == NULL) {
        CloseHandle(hndMappedFile);
        CloseHandle(hndFile);
        return CANNOTCREATEVIEWOFMAPPEDFILE;
    }

    BYTE bytesCabecera[256];
    memset(bytesCabecera, 0, 256);

    memcpy(bytesCabecera, bytView, 256);

    nNumeroNodos = (unsigned __int32)(*((unsigned __int32 *)(&bytView[sizeof(ENVOLVENTE)])));
    nNumeroAdyacentes = (unsigned __int32)(*((unsigned __int32 *)(&bytView[sizeof(ENVOLVENTE) + sizeof(unsigned __int32)])));
    memcpy(&Envolvente, bytView, sizeof(ENVOLVENTE));

    Nodos = (NODO *)(bytView + 256);
    Adyacentes = (ADYACENTE *)(bytView + 256 + nNumeroNodos * sizeof(NODO));
    vOffsetAdyacentes = (unsigned __int32 *)(bytView + 256 + nNumeroNodos * sizeof(NODO) + nNumeroAdyacentes * sizeof(ADYACENTE));

    bMemNodos = true;
    bMemAdyacentes = true;
    bMemOffsetAdy = true;
    bMapped = true;

    return OK;
}
When I create an array of this class and read the data with fread method it works fine but when the data is read mapping the file some files are loaded ok but after that GetLastError return 8 (from MSDN: ERROR_NOT_ENOUGH_MEMORY) .


Some idea is appreciated!!!


Best regards!!