基于位(Bit)的文件操作读写类

来源:互联网 发布:唐山震后重建数据 编辑:程序博客网 时间:2024/06/10 20:16

  因为这学期期末会写一个哈夫曼压缩的程序,所以自己就写了个基于位的文件操作读写类。

基本思路就是 凑足 8位  然后进行读写。

//CMBitFile 基于位的文件操作类//作者:AkChen//QQ:779825427#pragma once #define MODE_READ  1      //读模式#define MODE_WRITE 2      //写模式#define MODE_NONE  3      //没有打开#include <stdio.h>class CMBitFile{private:int  m_Mode;                             //文件操作模式unsigned char m_chTemp;                  //字符存储缓存int  m_Mask;                             //记录位在一个字节的位置FILE* m_pFile;                           //文件指针public:bool WriteBit(int bit);                  //写入一位bool ReadBit(int& bit);                  //读进一位bool WriteByte(unsigned char byte);      //写一字节bool WriteMem(void* pSrc, int len);bool Printf(char*, ...);bool ReadMem(void* pDst, int len);bool ReadByte(unsigned char& byte);      //读字节bool Open(char* filename,int mode);      //打开文件bool Close();                            //关闭文件long GetFileSize(char* fname);CMBitFile();virtual~CMBitFile();};
<pre class="cpp" name="code">#include "CMBitFile.h"typedef char *va_list; #define va_start(ap, v) ap = (va_list)&v + sizeof(v) #define va_arg(ap, t) (((t *)ap)++[0]) #define va_end(ap)CMBitFile::CMBitFile(){m_Mode = MODE_NONE;m_pFile = NULL;m_chTemp = 0;}CMBitFile::~CMBitFile(){if (m_Mode == MODE_NONE&& m_pFile != NULL){fclose(m_pFile);}}bool CMBitFile::Open(char* filename, int mode){switch (mode){case MODE_READ:fopen_s(&m_pFile, filename, "rb");m_Mode = mode;m_Mask = 9;m_chTemp = 0;break;case MODE_WRITE:fopen_s(&m_pFile, filename, "wb");m_Mode = mode;m_Mask = 1;m_chTemp = 0;break;default:m_Mode = MODE_NONE;break;}if (m_Mode != MODE_NONE && m_pFile!=NULL)return true;elsereturn false;}bool CMBitFile::Close(){if (m_pFile != NULL){if (m_Mode == MODE_WRITE&& m_Mask != 1)    //如果刚一个字节 m_Mask会 ==1{fwrite(&m_chTemp, 1, 1, m_pFile);         //如果一个字节没有写完也把剩下的写完}fclose(m_pFile);return true;}else{return false;}}bool CMBitFile::ReadBit(int& bit){if (m_pFile == NULL || m_Mode != MODE_READ)return false;if (m_Mask >8)                          //在初始位置 读入一个字节{if (fread_s(&m_chTemp, 1, 1, 1, m_pFile) != 1)return false;m_Mask = 1;}bit = (m_chTemp & (1<<(8-m_Mask))) ? 1 : 0;m_Mask++;return true;}bool CMBitFile::WriteBit(int bit){if (m_pFile == NULL || m_Mode != MODE_WRITE)return false;if (m_Mask > 8)                            //已经将8为保存到一个字节里了{fwrite(&m_chTemp, 1, 1, m_pFile);m_chTemp = 0;                         //把缓存清空m_Mask = 1;                           }unsigned char b1 = 1;unsigned char b0 = 0;m_chTemp |= ((bit) ? b1 : b0) << (8 - m_Mask);m_Mask++; return true;}bool CMBitFile::ReadByte(unsigned char& byte){unsigned char temp = 0,result = 0;int bit;if (m_pFile == NULL || m_Mode != MODE_READ)return false;for (int i = 1; i <= 8; i++)         //读取8位{if (!this->ReadBit(bit)){return false;}result |= ((bit) ? 1 : 0) << (8 - i);}byte = result;return true;}bool CMBitFile::WriteByte(unsigned char byte){if (m_pFile == NULL || m_Mode != MODE_WRITE)return false;for (int i =1 ; i <= 8; i++)        //写8位{this->WriteBit(((1 << (8 - i))&byte)?1:0);}return true;}bool  CMBitFile::WriteMem(void* pSrc, int len){if (m_pFile == NULL || m_Mode != MODE_WRITE)return false;unsigned char* byte = (unsigned char*)pSrc;for (int i = 0; i < len; i++){WriteByte(*byte);byte++;}return true;}bool  CMBitFile::ReadMem(void* pDst, int len){if (m_pFile == NULL || m_Mode != MODE_READ)return false;unsigned char* byte = (unsigned char*)pDst;for (int i = 0; i < len; i++){if (!ReadByte(*byte))return false;byte++;}return true;}long  CMBitFile::GetFileSize(char* fname){long size;Open(fname, MODE_READ);fseek(m_pFile, 0, SEEK_SET);fseek(m_pFile, 0, SEEK_END);size = ftell(m_pFile);Close();return size;}bool CMBitFile::Printf(char* fmt, ...){if (m_pFile == NULL || m_Mode != MODE_WRITE)return false;char buff[1024] = {'\0'};va_list args;int n;va_start(args, fmt);n = vsnprintf_s(buff, sizeof(buff),fmt,args);va_end(args);for (int i = 0; buff[i] != '\0'&&i < 1024; i++)this->WriteByte(buff[i]);return true;}


0 0
原创粉丝点击