博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++编程思想3-利用C++进行文件操作封装C函数
阅读量:5260 次
发布时间:2019-06-14

本文共 2010 字,大约阅读时间需要 6 分钟。

我们知道在C语言中许多文件操作的函数 很零散,在使用的时候不得不四处查找 ,我们是否能向C++中 的   CFile类等一样封装我们自己的文件操作呢?当然可以,我们这里我封装的是 C语言的文件操作函数  。实际上我们可以直接封装win32的API 函数 利用文件句柄进行文件操作,MFC的CFile类封装的就是 WIN32的API ,这里我只做测试用C来实现封装类File ,下面的File类可以实现对文件的读写 以及清空功能,简单的功能反应出面向对象的程序设计的好处,将对文件袋饿操作封装成了一个整体,文件有了自己的属性和行为。

对于FILE结构体指针 我们应该设计其为私有,这样做的是为了隐藏底层实现,从而实更好的封装,用户程序员只需要根据我们提供的接口进行文件操作 ,而不必考虑细节的实现。  我们对文件操作现在由分散转换成了集中,好处在自己编写代码的过程中就有所体会。。。

#ifndef  FILE_CLASS_DEFINE

#define  FILE_CLASS_DEFINE
#include <stdio.h>
#include "stdlib.h"
#include "string.h"
#include "windows.h"
class File
{
public:
 File()
 {
  this->f=NULL ;
  this->path="" ;
  this->modeAttribute="";
 }
 File(char*path,char * mode)
 {
  FILE *p =fopen(path,mode) ;
  this->path=path;
  this->modeAttribute=mode ;
  if(p==NULL)
  {  
   printf("文件打开失败!\n") ;
   return ;
  }
  this->f=p;
 }
 ~File()
 {  
  if (!this->f==NULL)
  {
   fclose(this->f) ;
  }
  
 }
 bool WriteTextToFile(char nChar[],int length)
 {  
  if(this->f==NULL)
  {
   printf("请先打开文件!\n")  ;
  }
  int item= fwrite(nChar,1,length,this->f) ;
  if (item<length)
  {
   return false ;
  }
  return true ;
 }
 FILE * GetFilePointer()
 {
  return this->f;
 }
 int  ReadAllText(char buf[])
 {    
  char tem[11] ="";
  while (!feof(f))
  {  
   memset(tem,0,11) ;
   int len=fread(tem,1,10,this->f);
   strcat(buf,tem);
  }
  
  return 1;
 }
 void CloseFile()
 {
  fclose(this->f) ;
 }
 void ClearFile()
 {  
  this->CloseFile() ;//关闭文件
  DeleteFile(this->path) ;
  this->f=fopen(this->path,this->modeAttribute) ;
 }
private:
 FILE * f ;  //隐藏实现细节
 char * path ;
 char * modeAttribute  ;
 
};
#endif

void main()

{
 File  f("d:\\1.txt","a") ;
 char buf[100]="this is a test!" ;
 f.WriteTextToFile(buf,strlen(buf)) ;
 f.CloseFile() ;
 File f2("d:\\1.txt","a+");
 f2.ReadAllText(buf) ;
 printf(buf) ;
 f2.ClearFile() ;
}

 

 

 

IO格式化控制操做算子

 #include <iostream>

using namespace std ;
void main()
{  
  //操作算子的应用 进行格式控制等等 这些操作算子都在 IOSTREAM.H头文件中定义
   cout<<hex<<"0x"<<443<<endl ;
   cout<<oct<<"0"<<443<<endl ;
   cout<<dec<<443<<endl ;
   cout<<flush ;//只刷新缓冲区 
   cout<<endl ;//刷新缓冲区并且换行   清空缓冲区中没有输出地数据
   cout<<ends ; //和endl一样仅仅用于 strstreams

}

转载于:https://www.cnblogs.com/yuedongwei/archive/2011/12/30/4145557.html

你可能感兴趣的文章
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>
HDU-1255 覆盖的面积 (扫描线)
查看>>
css3学习01
查看>>
【USACO】 奶牛会展
查看>>
ActiveMQ笔记之点对点队列(Point-to-Point)
查看>>
继承和多态
查看>>
Dijkstra+计算几何 POJ 2502 Subway
查看>>
修复IE不能执行JS的方法
查看>>
程序员究竟该如何提高效率zt
查看>>
希尔排序法(缩小增量法)
查看>>
PHP编程基础学习(一)——数据类型
查看>>
MongoDB-JAVA-Driver 3.2版本常用代码全整理(2) - 查询
查看>>
NPOI处理Word文本中上下角标
查看>>
Android笔记 Handler
查看>>
如何阅读大型前端开源项目的源码(转)
查看>>
java.util.Arrays类详解
查看>>
idea搭建tocmat
查看>>
NYOJ-626-intersection set(二分查找)
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
Java 中 静态方法与非静态方法的区别
查看>>