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;
}