数据缓冲区对象管理器

/**************************************************
WinMain.cpp
数据缓冲区对象管理器
**************************************************/

// Include files
#include <windows.h>
#include <stdio.h>

class cDataPackage
{
  protected:
    // Data buffer and size
    void *m_Buf;
    unsigned long m_Size;

  public:
    cDataPackage()  { m_Buf = NULL; m_Size = 0; }
    ~cDataPackage() { Free();                   }

    void *Create(unsigned long Size)
    {
      // Free a previously created buffer
      Free();
      // Allocate some memory and return a pointer
      return (m_Buf = (void*)new char[(m_Size = Size)]);
    }

    // Free the allocated memory
    void Free() { delete m_Buf; m_Buf = NULL; m_Size = 0; }

    BOOL Save(char *Filename)
    {
      FILE *fp;

      // Make sure there's something to write
      if(m_Buf != NULL && m_Size) {
        // Open file, write size and data
        if((fp=fopen(Filename, "wb")) != NULL) {
          fwrite(&m_Size, 1, 4, fp);
          fwrite(m_Buf, 1, m_Size, fp);
          fclose(fp);
          return TRUE;
        }
      }
 
      return FALSE;
    }

    void *Load(char *Filename, unsigned long *Size)
    {
      FILE *fp;
    
      // Free a prior buffer
      Free();
 
      if((fp=fopen(Filename, "rb"))!=NULL) {
        // Read in size and data
        fread(&m_Size, 1, 4, fp);
        if((m_Buf = (void*)new char[m_Size]) != NULL)
          fread(m_Buf, 1, m_Size, fp);
        fclose(fp);
 
        // Store size to return
        if(Size != NULL)
          *Size = m_Size;
 
        // return pointer
          return m_Buf;
      }

      return NULL;
    }
};

// A structure to contain a name
typedef struct {
  char Name[32];
} sName;

int PASCAL WinMain(HINSTANCE hInst, HINSTANCE hPrev,           /
                   LPSTR szCmdLine, int nCmdShow)
{
  cDataPackage DP;
  DWORD Size;

  // Create the data package (w/64 bytes) and get the
  // pointer, casting it to an sName structure type.
  sName *Names = (sName*)DP.Create(64);

  // Since there are 64 bytes total, and each name uses
  // 32 bytes, then I can have 2 names stored.
  strcpy(Names[0].Name, "Jim");
  strcpy(Names[1].Name, "Adams");

  // Save the names to disk and free the data buffer
  DP.Save("names.dat");
  DP.Free();

  // Load the names from disk. Size will equal 64
  // when the load function returns.
  Names = (sName*)DP.Load("names.dat", &Size);

  // Display the names
  MessageBox(NULL, Names[0].Name, "1st Name", MB_OK);
  MessageBox(NULL, Names[1].Name, "2nd Name", MB_OK);

  // Free up the data package
  DP.Free();

  return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值