C++ fstream 自定义文件操作类

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;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值