//CFile.h
#include
#ifndef CFILE_H
#define CFILE_H
class CFile {
protected:
FILE* m_fp;//文件指针
char* m_filename;//文件名
char m_mode[4];//文件打开方式
//……其它属性
public:
CFile(); //构造一个不与任何文件关联的对象
//构造一个与文件filename关联的对象,其打开方式为mode
CFile(const char* filename,const char* mode = "r");
~CFile();//析构函数,负责关闭打开的文件等。
int printf(const char* format, ...);//封装vfprintf
int scanf(const char *format, ...);//封装fscanf
//……其它函数的封装
};
#endif // CFile.h end
//CFile.cpp
#include "CFile.h"
#include
#include
CFile:: CFile(){
m_fp=0;//文件指针为空
m_filename=0;//函数名为空
memset(m_mode,0,4);//给m_mode赋0
}
CFile::CFile(const char* filename,const char* mode){
if(filename && mode){
int num=strlen(filename);//文件名长度
m_filename=new char[num+1];//分配足以复制filename的空间
//下面将filename复制给成员m_filename
strcpy(m_filename, filename);
strcpy(m_mode,mode);// 将mode复制给成员m_mode
m_fp=fopen(m_filename,m_mode);//打开文件
}
else{
m_fp=0, m_filename=0,memset(m_mode,0,4);
}
}
CFile::~CFile(){
//将关联的文件关闭
if(m_fp)
fclose(m_fp);
//删除文件名
if(m_filename)
delete[]m_filename;
}
int CFile::printf(const char* format, ...){
//如果文件打开方式不是可写的返回-1
//如果没有关联文件,返回0
if(!m_fp)
return 0;
va_list ap;//定义一个va_list对象,其定义在stdarg.h中
va_start(ap,format);//获取"..."中的内容
vfprintf(m_fp,format,ap);//调用函数vfprintf
va_end(ap);//清空ap
return 1;
}
int CFile::scanf(const char *format, ...)
{
if(!Readable())
return 0;
int value=0;
va_list ap;
int list[10]={0};
int num=0,len=strlen(format);
va_start(ap,format);
for(int i=0;i if(format[i]= ='%'){
list[num]=i+1;
num++;
}
}
for(i=0;i switch(format[list[i]]){
case 'd':
{
int*p=va_arg(ap,int*);
try{//防止所传之值不是有效地址
value+=fscanf(m_fp,"%d",p);
}catch(...){
va_end(ap);throw "ERROR";
}
break;
}
case 's':
{
char*p=va_arg(ap,char*);
try{
value+=fscanf(m_fp,"%s",p);
}catch(...){
va_end(ap);throw "ERROR";
}
break;
}
case 'c':
{
char*p=va_arg(ap,char*);
try{
value+=fscanf(m_fp,"%c",p);
}catch(...){
va_end(ap);throw "ERROR";
}
break;
}
case 'f':
{
double*p=va_arg(ap,double*);
try{
value+=fscanf(m_fp,"%f",p);
}catch(...){
va_end(ap);throw "ERROR";
}
break;
}
default:
break;
}
}
va_end(ap);return value;
}
//CFile.cpp end.
//test.cpp
void main()
{
char filename[]="c:\\111.txt";
CFile file(filename,"w");
int n=10;
char s[]="Good!";
file.printf("%d\n%s\n",n,s);
}
/*注:对scanf的调用方法为
void main()
{
char filename[]="c:\\111.txt";
CFile file(filename,"r");
char ch=0;
try{
file.scanf("%c",ch);//没有取地址符&
}catch(char* error_string){
printf("%s\n", error_string);
}
printf("%c\n",ch);
}
--------------------next---------------------
阅读(1365) | 评论(0) | 转发(0) |