Linux高级环境编程实验报告2.doc
作业报告
学生姓名:学号:指导教师:
学生E-mail:
一、作业名称:带缓存的文件操作类
二、作业要求
在创立执行体程序库中的日志类的过程中,分析得出通过缓存向文件中写入数据时,能够提高读写磁盘的性能。本文根据这个思想,建立一个简单的文件操作的封装类,其内部对根本的文件操作函数〔open、lseek、read、write、close〕进行封装,对外提供读写操作接口,并提供数据的缓存效劳:1、调用该类的写操作接口时,数据要首先写到缓存中,再根据要求写入文件中;2、调用该类的度操作接口时,该类能够缓存读出的数据;3、读写缓存要保持一致性。
三、设计与实现
首先看下该封装类的定义:
classEXFileOperator{
public:
EXFileOperator(constchar*_FileName);
~EXFileOperator();
voidF_READ(int_position,int_length);
voidF_WRITE(constchar*pstrMsg);
private:
EXFileOperator();
intReadFile(intposition,intlength);
intWriteFile(constchar*pstrMsg);
intFlush();
constchar*FileName;
int_fd;
pthread_mutex_t*m_pMutex;
char*m_pBuffer;
unsignedintm_nUsedBytesForBuffer;
};
EXFileOperator类中F_READ和F_WRITE是该类对外提供的读写操作的接口,其中F_READ表示从给定位置(_Position)开始读出_length长度的文件内容;调用F_WRITE函数,将pstrMsg指向的信息串写入到文件中。
内部ReadFile和WriteFile分别封装了文件read和write操作函数,lseek也封装在ReadFile中。在读操作之前和缓存缺乏时可调用Flush函数进行缓存的刷新。另外,类中还提供了保存一些信息的成员变量,包括需要操作的文件的文件名(FileName)、文件标识符(_fd),以及互斥量m_pMutex和缓存区(m_Buffer)。
文件的翻开和关闭操作分别封装在该类的构造函数和析构函数中,设置缓存已用长度为0。假设互斥量初始化操作失败,那么需要进行一些去除工作。关闭文件后,还要撤销互斥量和回收缓存。
EXFileOperator::EXFileOperator(constchar*_FileName){
_fd=open(_FileName,O_RDWR|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR);
if(_fd==-1)throwInEXFileOperator::EXFileOperator(),openerror;
m_pBuffer=newchar[BUFFER_SIZE];
m_nUsedBytesForBuffer=0;
m_pMutex=newpthread_mutex_t;
if(pthread_mutex_init(m_pMutex,0)!=0){
deletem_pMutex;
delete[]m_pBuffer;
close(_fd);
throwInEXFileOperator::EXFileOperator(),initerror;
}
}
EXFileOperator::~EXFileOperator(){
if(_fd!=0)close(_fd);
if(m_pMutex!=0)deletem_pMutex;
if(m_pBuffer!=0)delete[]m_pBuf