文件操作类
打开文件
关闭文件指针,并删除文件
调用fprintf向文件写入数据
从文件中读取以换行符"\n"结束的一行,类似fgets函数
从文件文件中读取一行
从文件中读取数据块
向文件中写入数据块
关闭文件指针
文件操作类声明
class CFile
{
private:
FILE *m_fp;
bool m_bEnBuffer;
char m_filename[301];
char m_filenametmp[301];
public:
CFile();
bool IsOpened();
bool Open(const char *filename,const char *openmode,bool bEnBuffer=true);
bool CloseAndRemove();
bool OpenForRename(const char *filename,const char *openmode,bool bEnBuffer=true);
bool CloseAndRename();
void Fprintf(const char *fmt,...);
bool Fgets(char *buffer,const int readsize,bool bdelcrt=false);
bool FFGETS(char *buffer,const int readsize,const char *endbz=0);
size_t Fread(void *ptr,size_t size);
size_t Fwrite(const void *ptr,size_t size);
void Close();
~CFile();
};
文件操作类实现
CFile::CFile() // 类的构造函数
{
m_fp=0;
m_bEnBuffer=true;
memset(m_filename,0,sizeof(m_filename));
memset(m_filenametmp,0,sizeof(m_filenametmp));
}
void CFile::Close()
{
if (m_fp==0) return;
fclose(m_fp);
m_fp=0;
memset(m_filename,0,sizeof(m_filename));
if (strlen(m_filenametmp)!=0) remove(m_filenametmp);
memset(m_filenametmp,0,sizeof(m_filenametmp));
}
bool CFile::IsOpened()
{
if (m_fp==0) return false;
return true;
}
bool CFile::CloseAndRemove()
{
if (m_fp==0) return true;
fclose(m_fp);
m_fp=0;
if (remove(m_filename) != 0)
{
memset(m_filename,0,sizeof(m_filename));
return false;
}
memset(m_filename,0,sizeof(m_filename));
memset(m_filenametmp,0,sizeof(m_filenametmp));
return true;
}
CFile::~CFile() // 类的析构函数
{
Close();
}
bool CFile::Open(const char *filename,const char *openmode,bool bEnBuffer)
{
Close();
if ( (m_fp=FOPEN(filename,openmode)) == 0 ) return false;
memset(m_filename,0,sizeof(m_filename));
STRNCPY(m_filename,sizeof(m_filename),filename,300);
m_bEnBuffer=bEnBuffer;
return true;
}
bool CFile::OpenForRename(const char *filename,const char *openmode,bool bEnBuffer)
{
Close();
memset(m_filename,0,sizeof(m_filename));
STRNCPY(m_filename,sizeof(m_filename),filename,300);
memset(m_filenametmp,0,sizeof(m_filenametmp));
SNPRINTF(m_filenametmp,sizeof(m_filenametmp),300,"%s.tmp",m_filename);
if ( (m_fp=FOPEN(m_filenametmp,openmode)) == 0 ) return false;
m_bEnBuffer=bEnBuffer;
return true;
}
bool CFile::CloseAndRename()
{
if (m_fp==0) return false;
fclose(m_fp);
m_fp=0;
if (rename(m_filenametmp,m_filename) != 0)
{
remove(m_filenametmp);
memset(m_filename,0,sizeof(m_filename));
memset(m_filenametmp,0,sizeof(m_filenametmp));
return false;
}
memset(m_filename,0,sizeof(m_filename));
memset(m_filenametmp,0,sizeof(m_filenametmp));
return true;
}
void CFile::Fprintf(const char *fmt,...)
{
if ( m_fp == 0 ) return;
va_list arg;
va_start( arg, fmt );
vfprintf( m_fp, fmt, arg );
va_end( arg );
if ( m_bEnBuffer == false ) fflush(m_fp);
}
bool CFile::Fgets(char *buffer,const int readsize,bool bdelcrt)
{
if ( m_fp == 0 ) return false;
memset(buffer,0,readsize+1);
if (fgets(buffer,readsize,m_fp) == 0) return false;
if (bdelcrt==true)
{
DeleteRChar(buffer,'\n'); DeleteRChar(buffer,'\r');
}
return true;
}
bool CFile::FFGETS(char *buffer,const int readsize,const char *endbz)
{
if ( m_fp == 0 ) return false;
return FGETS(m_fp,buffer,readsize,endbz);
}
size_t CFile::Fread(void *ptr, size_t size)
{
if ( m_fp == 0 ) return -1;
return fread(ptr,1,size,m_fp);
}
size_t CFile::Fwrite(const void *ptr, size_t size )
{
if ( m_fp == 0 ) return -1;
size_t tt=fwrite(ptr,1,size,m_fp);
if ( m_bEnBuffer == false ) fflush(m_fp);
return tt;
}
用CFile类生成数据文件的用法
int main()
{
CFile File;
char strLocalTime[21];
memset(strLocalTime,0,sizeof(strLocalTime));
LocalTime(strLocalTime,"yyyymmddhh24miss");
char strFileName[301];
SNPRINTF(strFileName,sizeof(strFileName),300,"/tmp/data/surfdata_%s.xml",strLocalTime);
if (File.OpenForRename(strFileName,"w")==false)
{
printf("File.OpenForRename(%s) failed.\n",strFileName); return -1;
}
File.Fprintf("<data>\n"\
"<name>妲已</name><age>28</age><sc>火辣</sc><yz>漂亮</yz><memo>商要亡,关我什么事。</memo><endl/>\n"\
"<name>西施</name><age>25</age><sc>火辣</sc><yz>漂亮</yz><memo>1、中国排名第一的美女;\n"\
"2、男朋友是范蠡;\n"\
"3、老公是夫差,被勾践弄死了。</memo><endl/>\n"\
"</data>\n");
File.CloseAndRename();
}
用CDir类和CFile类处理数据文件的用法
int main()
{
CDir Dir;
if (Dir.OpenDir("/tmp/data","surfdata_*.xml")==false)
{
printf("Dir.OpenDir(/tmp/data) failed.\n"); return -1;
}
CFile File;
while (Dir.ReadDir()==true)
{
printf("处理文件%s...",Dir.m_FullFileName);
if (File.Open(Dir.m_FullFileName,"r")==false)
{
printf("failed.File.Open(%s) failed.\n",Dir.m_FullFileName); return -1;
}
char strBuffer[301];
while (true)
{
memset(strBuffer,0,sizeof(strBuffer));
if (File.FFGETS(strBuffer,300,"<endl/>")==false) break;
}
File.CloseAndRemove();
printf("ok\n");
}
}