基于位(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
- 基于位(Bit)的文件操作读写类
- VC++之文件基本操作之基于CArchive类的文件读写
- 任意类型数的bit位操作
- 常用的Bit位操作 记录
- 常见的位操作bit manipulation
- BIT位操作用途
- (嵌入式)位(bit)操作
- 基于位操作的类CBitBuffer
- 文件的读写操作
- 文件的读写操作
- 文件的读写操作
- 文件的读写操作
- 文件的读写操作
- 读写文件的操作
- 文件的读写操作
- 文件的读写操作
- 文件的读写操作
- 文件的读写操作
- 第三天
- NOIP2014 Day1T3 飞扬的小鸟 dp
- Python写爬虫——抓取网页并解析HTML
- iOS 实现打印功能
- HTML5新增加的标签&表单新增属性
- 基于位(Bit)的文件操作读写类
- iOS 应用程序的生命周期
- 南邮编程在线编程题十五:带参宏定义
- 如何从dll文件导出对应的lib文件
- bzoj3571: [Hnoi2014]画框
- windows下五种I/O模型的比较
- Linux -- chown . Ctrl 命令
- Servlet
- iOS的Mantle实战