C++编程思想3-利用C++进行文件操作封装C函数

简介: 我们知道在C语言中许多文件操作的函数 很零散,在使用的时候不得不四处查找 ,我们是否能向C++中 的   CFile类等一样封装我们自己的文件操作呢?当然可以,我们这里我封装的是 C语言的文件操作函数  。

我们知道在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


}

目录
相关文章
|
5月前
|
人工智能 机器人 编译器
c++模板初阶----函数模板与类模板
class 类模板名private://类内成员声明class Apublic:A(T val):a(val){}private:T a;return 0;运行结果:注意:类模板中的成员函数若是放在类外定义时,需要加模板参数列表。return 0;
158 0
|
8月前
|
安全 C++
【c++】继承(继承的定义格式、赋值兼容转换、多继承、派生类默认成员函数规则、继承与友元、继承与静态成员)
本文深入探讨了C++中的继承机制,作为面向对象编程(OOP)的核心特性之一。继承通过允许派生类扩展基类的属性和方法,极大促进了代码复用,增强了代码的可维护性和可扩展性。文章详细介绍了继承的基本概念、定义格式、继承方式(public、protected、private)、赋值兼容转换、作用域问题、默认成员函数规则、继承与友元、静态成员、多继承及菱形继承问题,并对比了继承与组合的优缺点。最后总结指出,虽然继承提高了代码灵活性和复用率,但也带来了耦合度高的问题,建议在“has-a”和“is-a”关系同时存在时优先使用组合。
476 6
|
程序员 C++ 容器
在 C++中,realloc 函数返回 NULL 时,需要手动释放原来的内存吗?
在 C++ 中,当 realloc 函数返回 NULL 时,表示内存重新分配失败,但原内存块仍然有效,因此需要手动释放原来的内存,以避免内存泄漏。
|
存储 前端开发 C++
C++ 多线程之带返回值的线程处理函数
这篇文章介绍了在C++中使用`async`函数、`packaged_task`和`promise`三种方法来创建带返回值的线程处理函数。
494 6
|
编译器 C语言 C++
C++入门3——类与对象2-2(类的6个默认成员函数)
C++入门3——类与对象2-2(类的6个默认成员函数)
131 3
|
C++
C++ 多线程之线程管理函数
这篇文章介绍了C++中多线程编程的几个关键函数,包括获取线程ID的`get_id()`,延时函数`sleep_for()`,线程让步函数`yield()`,以及阻塞线程直到指定时间的`sleep_until()`。
291 0
C++ 多线程之线程管理函数
|
安全 编译器 C++
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
【C++篇】C++类与对象深度解析(三):类的默认成员函数详解
111 3
|
编译器 C语言 C++
详解C/C++动态内存函数(malloc、free、calloc、realloc)
详解C/C++动态内存函数(malloc、free、calloc、realloc)
2346 1
|
存储 编译器 C++
C++入门3——类与对象2-1(类的6个默认成员函数)
C++入门3——类与对象2-1(类的6个默认成员函数)
177 1
|
编译器 C语言 C++
C++入门6——模板(泛型编程、函数模板、类模板)
C++入门6——模板(泛型编程、函数模板、类模板)
207 0
C++入门6——模板(泛型编程、函数模板、类模板)