c++实现读写文件

原创 2015年11月20日 16:18:57

本程序主要利用mmap函数利用映射的方式实现文件的读写,可以在此基础上改动实现read,write方式

CFile.h

#include <iostream>
#include <cstdio>
#include <unistd.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <cstring>
#include <string>
#include <sys/stat.h>
#include <sys/types.h>

class CFile
{
public:
	CFile(const std::string& filename);
    virtual ~CFile();

	bool openFile(const char* filemode);
    int getFd() { return fd;}
	int getFileSize();
	bool writeFile(const std::string& data);
	void closeFile();
	bool unlinkFile();
	std::string getFileName(){ return filename;}
	bool checkFile();
	bool reName(const std::string& newname);	
	void readFile(void* buf, int size, int offset);
	void* getMapPtr() { return mapptr;}
	void syncFile(int size) {msync((char*)mapptr+mapsize-size, size, MS_ASYNC);}
	int getFileCreatTime();
private:	
   	bool unmapFile()
	{
		if(mapptr)
		{
			if(munmap(mapptr, maxsize) !=0)
			{
				return false;
			}			
		}
		return true;
    }
	bool mmapFile()
	{
		mapptr = mmap(0, maxsize, PROT_READ|PROT_WRITE, MAP_SHARED,fd, 0);
		if(mapptr == NULL)
		{std::cout<< "map file err\n"; return false;}
		return true;
    }
	off_t getPosition()
	{
		return lseek(fd, 0, SEEK_END);
	}
private:
	int fd;
	FILE* file;
	void* mapptr;
	unsigned long int offset;
	size_t mapsize, maxsize;
	const std::string filename;
    CFile(const CFile&);
	CFile& operator=(const CFile&);
};

CFile::CFile(const std::string& filename):filename(filename),mapsize(0),maxsize(65535),file(NULL)
{}
CFile::~CFile()
{
	if(file)
		closeFile();
}

void CFile::closeFile()
{
	if(fd <0) return;
	if (!unmapFile()) {
		std::cout << "unmap err\n";
	}   
    if(fd >0) close(fd);
	fd = -1;  
	file = NULL;
}

bool CFile::openFile(const char* filemode) //"at+"
{
	if(!checkFile())
	{
		std::cout << "file not exists\n";
		return false;
	}
	file = fopen(filename.c_str(), filemode);
	if(file == NULL)
	{
		std::cout << "open file err\n";
		return false;
	}
	else
	{
		fd = fileno(file);
		mapsize = getPosition();
	}
	return true; 
}

int CFile::getFileSize()
{
	struct stat filestat;
	fstat(fd, &filestat);
	return filestat.st_size;
	// long int curpos,length;
	// curpos = ftell(file);
	// fseek(file, 0L,SEEK_END);
	// length = ftell(file);
	// fseek(file,curpos, SEEK_SET);
	// return length;
}

bool CFile::writeFile(const std::string& data)
{
	size_t datasize = data.size();
	int fileLen = mapsize;
	int offset = datasize + fileLen;
	if(offset >= maxsize)
	{
	    closeFile();
		reName(filename+std::string(".bk"));
		if(!checkFile())
			return false;
	}
	if(fd < 0)
	{	std::cout<< "no open the file\n"; return false;}
	if(ftruncate(fd, offset) < 0)
	{
		return false;
	}		

	mmapFile();
	char *ptr = reinterpret_cast<char*>(mapptr);
	memcpy(ptr+fileLen, data.c_str(), datasize);
	mapsize = offset;
	return true;  
}

bool CFile::unlinkFile()
{
	if(!checkFile())
	{
		return false;
	}
	closeFile();
	return remove(filename.c_str())==0?true:false;
}

bool CFile::checkFile()
{
	if(access(filename.c_str(), F_OK)==0)
		return true;
	else
	{
		int fd = open(filename.c_str(), O_CREAT);
		if(fd < 0)
		{
			std::cout << "create file err\n";
			return false;
		}
		close(fd);
	}
	return true;
}

bool CFile::reName(const std::string& newname)
{
	if(rename(filename.c_str(), newname.c_str())==0)
		return true;
	else
		return false;
}

void CFile::readFile(void* buf, int size, int offs)
{
	if(!checkFile())
	{
		std::cout << "read file err\n";
		return;
	}
	int length = getFileSize();
	if( offs > length)
	{
		std::cout << "offset number too big\n";
		return;
	}
	else
	{
		int readavail = 0;
	    if(size + offs > length)
		{
            readavail = length - offs;		
		}
		else
			readavail = size;
		void* ptr = mmap(NULL, readavail, PROT_READ | PROT_WRITE, MAP_SHARED,  
                         fd, 0);
		char *p = reinterpret_cast<char*>(ptr);		
		memcpy(buf, (void*)(p+offs), readavail);
	}
}

int CFile::getFileCreatTime()
{
	struct stat info;
	stat(filename.c_str(), &info);
	return info.st_ctime;
}

Test.cpp

#include "CFile.h"
int main(int argc, char *argv[])
{
    std::string filename("./log");
	CFile *cFile = new CFile(filename);
	// cFile->openFile("a+");
	// char buf[20] = {'\0'};
	// cFile->readFile(buf, 10, 3);
	// std::cout <<buf <<"\n";
	// cFile->closeFile();
	cFile->openFile("at+");
	std::string writestr("ABCDEFGHIJKLMNOPQRSTUVWXYZ\n");
	cFile->writeFile(writestr);
	std::string writestr2("sdgagagaergrefzrew\n");
	cFile->writeFile(writestr2);
	cFile->syncFile(writestr.size() + writestr2.size());
	// std::cout << cFile->getFileSize() << "\n";
	cFile->closeFile();
	//const std::string newname("./clog");
	//cFile->reName(newname);
	//cFile->unlinkFile();

    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

c++实现读写文件

本程序主要利用mmap函数利用映射的方式实现文件的读写,可以在此基础上改动实现read,write方式 CFile.h #include #include #include #include...

文件读写问题 以及整数排序问题

题目:文件中有一组整数,要求排序后输出到另一个文件中。 本文考察两个方向,一个是文件读写操作,另外一个是排序。 关于排序这里就不详细说了,这里采用快速排序的方法。主要讲一下文件(文...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

C++中文件读取处理(按行或者单词)

前段时间参加蓝桥杯,遇到一些题目,题目本身不难,按照常规思路写代码即可,但是我忘了如何读取文件了。。。面对一堆数据楞是写不出。还有几天是蓝桥杯的决赛,所以为了避免踩同样的坑,我打算通过实例复习下文件读...

BMP文件读写复习---C++实现

花了几个小时把BMP文件的格式内容看了一遍,写了个小程序。。。 BMP文件格式写的不错的文章:http://www.cnblogs.com/ZXYloveFR/archive/2012/08/06/...

C Plus Plus 实现文件读写

C Plus Plus 实现文件读写 Scarborough_Coral 前面介绍了C语言的文件...

c++实现bmp文件的读写

程序分为bmp相关的三个文件以及一个实例文件:  1.bmp格式文件的结构体定义--  bmpstruct.h  2.bmp格式文件的类定义文件-- cBMPimage.h  3.bmp格式文件的类实...

C#实现对Word文件读写

手头上的一个项目报表相对比较简单,所以报表打印采用VBA引擎,通过定制Word模版,然后根据模版需要填充数据,然后OK,打印即可。 实现方法:首先需要引用VBA组建,我用的是Office2003 P...

c读写文件实例

#include                        ...

常用的C/C++文本文件的读写函数

概述 文本文件的读写是算法研究和工程应用中常见的功能模块。C和C++的标准库中提供了多种文本文件的读写方法,我们一般都会掌握其中比较习惯使用的一种或几种方法。解决问题的方法不在多,而在精。经过在网上...

C语言从TXT文件中读写数据

下面是一个简单文件读取测试程序,首先是写数据,将数字0~9写入到data.txt文件中,然后再从data.txt中读取数据,将读到的数据存到数组a[10]中,并且打印到控制台上。 下面是程序: #...
  • hjl240
  • hjl240
  • 2015-07-29 19:27
  • 16116
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)