C++ fstream 自定义文件操作类
这里主要将fstream封装成一个简单的文件操作的类
FileOperate.h 头文件
// FileOperate.h
#ifndef FILEOPERATE_H
#define FILEOPERATE_H
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <fstream>
#include <unistd.h>
using namespace std;
class FileOperate
{
public:
FileOperate();
FileOperate(const std::string& file);
~FileOperate();
// 创建文件
static bool create(const std::string &file);
// 删除文件
static bool remove(const std::string &file);
// 文件是否存在
static bool exist(const std::string &file);
// 打开文件
bool open(ios_base::openmode __mode = std::fstream::in | std::fstream::out);
bool open(const std::string &file, ios_base::openmode __mode = std::fstream::in | std::fstream::out);
// 关闭文件
void close();
// 重命名文件
bool rename(const std::string &newName);
// 文件是否存在
bool isExist();
// 获取文件名
const std::string fileName();
// 获取文件所在目录
const std::string fileDir();
// 获取文件大小(总字节数)
std::size_t fileSize();
// 判断当前字符是否在最后
bool atEnd();
// 读取文件内容
void read(std::string &buffer, size_t bufferSize);
const std::string readLine();
const std::string readAll();
// 写数据到文件
void write(const std::string &data);
private:
std::string mFile;
std::fstream mFileStream;
};
#endif // FILEOPERATE_H
FileOperate.cpp 源文件
// FileOperate.cpp
#include "FileOperate.h"
#include <stdio.h>
FileOperate::FileOperate()
{}
FileOperate::FileOperate(const std::string &file) : mFile(file)
{}
FileOperate::~FileOperate()
{
if (mFileStream.is_open()) {
close();
}
}
/*
* 创建文件
*/
bool FileOperate::create(const std::string &file)
{
std::fstream out_file;
out_file.open(file.c_str(), std::ios::out);
if (!out_file) {
return false;
}
out_file.close();
return true;
}
/*
* 删除文件
*/
bool FileOperate::remove(const std::string &file)
{
// 删除文件,成功返回0,否则返回-1
if (-1 == std::remove(file.c_str())) {
return false;
}
return true;
}
bool FileOperate::exist(const string &file)
{
if (access(file.c_str(), F_OK) == 0)
return true;
return false;
}
bool FileOperate::open(ios_base::openmode __mode)
{
mFileStream.open(mFile.c_str(), __mode);
return mFileStream.is_open();
}
bool FileOperate::open(const string &file, ios_base::openmode __mode)
{
mFile = file;
return open(__mode);
}
void FileOperate::close()
{
mFileStream.close();
mFileStream.clear();
}
/*
* 文件重命名
*/
bool FileOperate::rename(const std::string &newName)
{
std::string newFile = fileDir() + newName;
int result = std::rename(mFile.c_str(), newFile.c_str());
if ( result == 0 )
return true;
return false;
}
/*
* 判断文件是否存在
*/
bool FileOperate::isExist()
{
return FileOperate::exist(mFile);
}
/*
* 获取文件名
* 文件绝对路径: /home/root/.../Test/test1.txt
* 返回值 : test1.txt
*/
const string FileOperate::fileName()
{
string name = mFile;
std::size_t pos = mFile.rfind('/');
if (pos != std::string::npos) {
name = mFile.substr(pos+1);
}
return name;
}
/*
* 获取文件所在目录
* 文件绝对路径: /home/root/.../Test/test1.txt
* 返回值 : /home/root/.../Test/
*/
const string FileOperate::fileDir()
{
string dir = "";
std::size_t pos = mFile.rfind('/');
if (pos != std::string::npos) {
dir = mFile.substr(0, pos+1);
}
return dir;
}
/*
* 获取文件大小(总字节数)
*/
size_t FileOperate::fileSize()
{
#if 0
// 方式一
mFileStream.seekg(0, mFileStream.end);
int length = mFileStream.tellg();
mFileStream.seekg(0, mFileStream.beg);
return length;
#endif
// 方式二
struct stat info;
stat(mFile.c_str(), &info);
return static_cast<std::size_t>(info.st_size);
}
bool FileOperate::atEnd()
{
// peek函数的作用是获取下一个字符,但是指针不会移动
return mFileStream.peek() == EOF;
}
void FileOperate::read(string &buffer, size_t bufferSize)
{
buffer.resize(bufferSize);
mFileStream.read(&buffer[0], bufferSize);
}
const string FileOperate::readLine()
{
// 文件存在 读取数据
std::string dataStr = "";
getline(mFileStream, dataStr);
return dataStr;
}
const string FileOperate::readAll()
{
std::string buffer;
size_t length = fileSize();
FileOperate::read(buffer, length);
return buffer;
}
void FileOperate::write(const string &data)
{
mFileStream << data << '\n';
}
使用方式
检测文件是否存在 不存在则创建该文件
std::string fileStr = "/home/Test/Test1.txt";
if (!FileOperate::exist(fileStr)) { // 检测文件是否存在
if (!FileOperate::create(fileStr)) { // 创建文件
cout << fileStr << " create failed" << endl;
return 0;
}
}
打开文件
// 方式一
FileOperate mFileOperate("/home/Test/Test1.txt");
if (!mFileOperate.open(std::fstream::in | std::fstream::out | std::fstream::app)) {
cout << "文件打开失败" << endl;
return 0;
}
// 方式二
FileOperate mFileOperate;
std::string fileStr = "/home/Test/Test1.txt";
if (!mFileOperate.open(fileStr, std::fstream::in | std::fstream::out | std::fstream::app)) {
cout << "文件打开失败" << endl;
return 0;
}
获取文件名 或 文件所在目录 文件大小(总字节数)
FileOperate mFileOperate("/home/Test/Test1.txt");
// 获取文件名
cout << mFileOperate.fileName() << endl; // 输出: Test1.txt
// 获取文件所在目录
cout << mFileOperate.fileDir() << endl; // 输出: /home/xushuan/Test/
// 获取文件大小
cout << mFileOperate.fileSize() << endl;
读取文件数据
// 方式一 一行一行读取
std::string data;
while (!mFileOperate.atEnd()) {
data = mFileOperate.readLine();
}
// 方式二 读取指定字节大小的数据
std::string data;
mFileOperate.read(data, 100);
// 方式三 一次性全部读取
// 方式一
std::string data = mFileOperate.readAll();
// 方式二
string data;
mFileOperate.read(data, mFileOperate.fileSize());
写入数据到文件
// 写入数据到文件
mFileOperate.write("hello");
关闭文件
// 关闭文件
mFileOperate.close();
重命名该文件
// 重命名文件
if (!mFileOperate.rename("Test2.txt")) {
cout << "rename failed" << endl;
}