运用FILE对文本文件进行指定读取、删除,指定位置添加一行操作类

来源:互联网 发布:刘一龙 知乎 编辑:程序博客网 时间:2024/05/02 00:38

1、文件操作类定义

#ifndef FILEOPERATION_H
#define FILEOPERATION_H

#include <stdio.h>
#include <string>
using namespace std;

class FileOperation
{
public:
 FileOperation();
 FileOperation(char*);
 ~FileOperation();
 bool Open(char*);
 char* ReadLine(int index = 1);
 bool WriteLine(char* , int index = 1);
 bool RemoveLine(int index = 1);
 void Close();
 

private:
 FILE* m_file;
 string m_fname;

};

#endif

 

2、文件操作类实现

#include "FileOperation.h"

FileOperation::FileOperation() : m_file(NULL)
{
}

FileOperation::FileOperation(char* name) : m_fname(name), m_file(NULL)
{
}

FileOperation::~FileOperation()
{
 if(m_file != NULL)
 {
  fclose(m_file);
  m_file = NULL;
 }
}

bool FileOperation::Open(char* name)
{
 if(m_file != NULL)
 {
  delete m_file;
  m_file = NULL;
 }

 m_file = fopen(name,"r");
 if(m_file == NULL)
 {
  return false;
 }
 m_fname = name;
 return true;
}

void FileOperation::Close()
{
 if(m_file != NULL)
 {
  fclose(m_file);
  m_file = NULL;
 }
}

char* FileOperation::ReadLine(int index)
{
 if(m_file == NULL)
 {
  m_file = fopen(m_fname.c_str(),"r");
  if(m_file == NULL)
  {
   return NULL;
  }
 }
 else
 {
  fseek(m_file,0,SEEK_SET);
 }

 char stmp[1024];
 char* sres = NULL;
 int icount = 0;
 while(!feof(m_file))
 {
  sres = fgets(stmp,1024,m_file);
  icount++;
  if(icount == index)
  {
   break;
  }
 }
 return sres;
}

bool FileOperation::WriteLine(char* str, int index)
{
 if(m_file == NULL)
 {
  m_file = fopen(m_fname.c_str(),"r");
  if(m_file == NULL)
  {
   return NULL;
  }
 }
 else
 {
  fseek(m_file,0,SEEK_SET);
 }

 FILE* ftmp;
 ftmp = fopen("tmp.tmp","w+t");
 if(ftmp == NULL)
 {
  return false;
 }
 
 char stmp[1024];
 char* sres = NULL;
 int icount = 0;
 int inum = 0;
 while(!feof(m_file))
 {
  sres = fgets(stmp,1024,m_file);
  int ilen = 0;
  icount++;
  if(icount == index)
  {
   ilen = strlen(str);
   inum = fwrite(str,sizeof(char),ilen,ftmp);
   if(inum != ilen)
   {
    printf("insert string error!");
    break;
   }
   inum = fwrite("/n",1,1,ftmp);
   if(inum != 1)
   {
    printf("insert string error!");
    break;
   }
  }
  if(sres != NULL)
  {
   ilen = strlen(sres);
   inum = fwrite(sres,sizeof(char),ilen,ftmp);
   if(inum != ilen)
   {
    printf("write string error!");
    break;
   }
  }
 }
 fclose(m_file);
 fseek(ftmp,0,SEEK_SET);

 m_file = fopen(m_fname.c_str(),"w+t");
 if(m_file == NULL)
 {
  return false;
 }
 while(!feof(ftmp))
 {
  sres = fgets(stmp,1024,ftmp);
  if(sres != NULL)
  {
   int ilen = strlen(sres);
   inum = fwrite(sres,sizeof(char),ilen,m_file);
   if(inum != ilen)
   {
    printf("write string error!");
    break;
   }
  }
 }
 fclose(ftmp);
 fclose(m_file);
 remove("tmp.tmp");
 m_file = fopen(m_fname.c_str(),"r");

 return true;
}

bool FileOperation::RemoveLine(int index)
{
 if(m_file == NULL)
 {
  m_file = fopen(m_fname.c_str(),"r");
  if(m_file == NULL)
  {
   return NULL;
  }
 }
 else
 {
  fseek(m_file,0,SEEK_SET);
 }
 
 FILE* ftmp;
 ftmp = fopen("tmp.tmp","w+t");
 if(ftmp == NULL)
 {
  return false;
 }
 
 char stmp[1024];
 char* sres = NULL;
 int icount = 0;
 int inum = 0;
 while(!feof(m_file))
 {
  sres = fgets(stmp,1024,m_file);
  int ilen = 0;
  icount++;
  if(icount == index)
  {
   continue;
  }
  if(sres != NULL)
  {
   ilen = strlen(sres);
   inum = fwrite(sres,sizeof(char),ilen,ftmp);
   if(inum != ilen)
   {
    printf("write string error!");
    break;
   }
  }
 }
 fclose(m_file);
 fseek(ftmp,0,SEEK_SET);
 
 m_file = fopen(m_fname.c_str(),"w+t");
 if(m_file == NULL)
 {
  return false;
 }
 while(!feof(ftmp))
 {
  sres = fgets(stmp,1024,ftmp);
  if(sres != NULL)
  {
   int ilen = strlen(sres);
   inum = fwrite(sres,sizeof(char),ilen,m_file);
   if(inum != ilen)
   {
    printf("write string error!");
    break;
   }
  }
 }
 fclose(ftmp);
 fclose(m_file);
 remove("tmp.tmp");
 m_file = fopen(m_fname.c_str(),"r");
 
 return true;
}

 

3、客户使用类

#include <iostream>
#include "FileOperation.h"

int main()
{
 FileOperation fp;
 if(!fp.Open("E:/myproject/fileoperation/file/test.txt"))
 {
  return -1;
 }

 cout << fp.ReadLine() << endl;
 cout << fp.ReadLine(2) << endl;
 cout << fp.ReadLine(5) << endl;
 cout << fp.ReadLine(10) << endl;

 char*res = fp.ReadLine(13);
 if( res != NULL)
  cout << res << endl;

 fp.WriteLine("aaaaaa", 1);
 fp.WriteLine("bbbbbbbb", 3);
 fp.WriteLine("cccccccccc", 8);

 fp.WriteLine("ddddddddddd",17);

 fp.RemoveLine();
 fp.RemoveLine(2);
 fp.RemoveLine(3);
 fp.RemoveLine(28);

 fp.Close();
 return 0;
}