C++文件处理工具类,hpp文件,使用时只需要include即可,跨平台

File.hpp

#ifndef FILE_HPP
#define FILE_HPP #include <fstream>
#include <string>
#include <stdexcept>
#include <memory>
#include <sstream>
#include <unistd.h> #include<sys/stat.h> namespace sh
{
enum class FileMode
{
EXISTS = 0,//存在
EXECUTE = 1,//执行
WRITE = 2,//写
READ = 4//读
}; /**
* 文件操作
* @author: sherlock_lht
*/
class BaseFileIO
{ protected: std::fstream fileStream;
std::string fileName; explicit BaseFileIO(const std::string &fileName)
{
this->fileName = fileName;
}
public:
/**
* 检查文件是否存在
*/
static bool exists(const std::string &filePath)
{
return access(filePath.c_str(), F_OK) == 0;
} /**
* 检查指定文件的指定属性,包括是否存在、是否可读、是否可写、是否有权限执行
*/
static bool checkFileMode(const std::string& filePath, sh::FileMode mode)
{
return access(filePath.c_str(), (int)mode) == 0;
} /**
* 给指定文件赋予权限,同chmod指令
*/
static bool chmodFile(const std::string &filePath, int mode)
{
return chmod(filePath.c_str(), mode) == 0;
} public:
/**
* 打开文件,返回是否成功打开
*/
bool open(std::ios_base::openmode mode)
{
if (fileStream.is_open())
{
close();
}
fileStream.open(fileName, mode);
return fileStream.is_open();
} /**
* 设置文件的开始读取偏移
*/
void seekInputPosition(std::size_t offsetPosition, std::ios_base::seekdir position = std::ios::beg)
{
fileStream.seekg(offsetPosition, position);
} /**
* 是否已经读到end,可用此方法判断文件是否已经读完
*/
bool endOfFile() const
{
return fileStream.eof();
} /**
* 获取当前处理的文件名称
*/
std::string getFileName() const
{
return fileName;
} /**
* 关闭文件流,如果从未打开,则无任何操作
*/
void close()
{
if (fileStream.is_open())
{
fileStream.close();
}
} virtual ~BaseFileIO()
{
close();
}
}; class File: public BaseFileIO
{
public:
/**
* 向指定的文件写入指定的内容,返回值表示是否写入成功
*/
static bool saveTextTo(const std::string &fileName, const std::string &text)
{
File fileToWrite(fileName);
if (fileToWrite.open(std::ios::out | std::ios::app))
{
fileToWrite.write(text);
fileToWrite.close();
return true;
}
return false;
}
public: explicit File(const std::string &fileName)
: BaseFileIO(fileName)
{} /**
* 写入内容,返回值表示写入成功的长度
*/
std::size_t write(const std::string &content)
{
auto before = fileStream.tellp();
fileStream.write(content.data(), content.length());
return fileStream.tellp() - before;
} /**
* 读取所有文件内容
* offset参数表示开始读取的偏移
* 如果在调用之前有读取过文件,则会影响该函数的开始读取位置
*/
std::string readAll(std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
}
if (offset > 0)
{
seekInputPosition(offset);
}
std::stringstream buf;
buf << fileStream.rdbuf();
return buf.str();
} /**
* 读取指定数量的字符串,如果内容不够,则读完
* offset参数表示开始读取的偏移
* 读取位置置于本次最后读取的内容的结尾
*/
std::string read(std::size_t maxSize, std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
}
if (offset > 0)
{
seekInputPosition(offset);
}
std::unique_ptr<char[]> buf(new(std::nothrow) char[maxSize + 1]);
fileStream.read(buf.get(), maxSize);
std::size_t size = fileStream.gcount();
std::string str(buf.get(), size);
return str;
} /**
* 从标记开始位置读取到一行结尾,包括终止符
* offset参数表示开始读取的偏移
*/
std::string readLine(std::size_t maxSize, std::size_t offset = 0)
{
if (!fileStream.is_open())
{
return "";
} std::unique_ptr<char[]> buf(new(std::nothrow) char[maxSize + 1]);
fileStream.getline(buf.get(), maxSize);
std::size_t size = fileStream.gcount();
std::string str(buf.get(), size);
return str;
}
};
} #endif //FILE_HPP

C++文件处理工具类的更多相关文章

  1. 文件类型工具类:FileTypeUtil

    个人学习,仅供参考! package com.example.administrator.filemanager.utils;import java.io.File;/** * 文件类型工具类 * * ...

  2. iOS开发拓展篇—封装音频文件播放工具类

    iOS开发拓展篇—封装音频文件播放工具类 一.简单说明 1.关于音乐播放的简单说明 (1)音乐播放用到一个叫做AVAudioPlayer的类 (2)AVAudioPlayer常用方法 加载音乐文件 - ...

  3. 文件夹工具类 - FolderUtils

    文件夹工具类,提供创建完整路径的方法. 源码如下:(点击下载 -FolderUtils.java .commons-io-2.4.jar ) import java.io.File; import o ...

  4. java文件处理工具类

    import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.BufferedRead ...

  5. 写文件的工具类,输出有格式的文件(txt、json/csv)

    import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; import java.io. ...

  6. properties文件读写工具类

    java代码: import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; ...

  7. Java-Properties文件读取工具类

    import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configurat ...

  8. Java 文件切割工具类

    Story: 发送MongoDB 管理软件到公司邮箱,工作使用. 1.由于公司邮箱限制附件大小,大文件无法发送,故做此程序用于切割大文件成多个小文件,然后逐个发送. 2.收到小文件之后,再重新组合成原 ...

  9. Java 压缩文件夹工具类(包含解压)

    依赖jar <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons ...

  10. ZIP解压缩文件的工具类【支持多级文件夹|全】

    ZIP解压缩文件的工具类[支持多级文件夹|全] 作者:Vashon 网上有非常多的加压缩演示样例代码.可是都仅仅是支持一级文件夹的操作.假设存在多级文件夹的话就不行了. 本解压缩工具类经过多次检查及重 ...

随机推荐

  1. 【Boost】Windows 下个人在配置 Boost 踩到的坑以及解决方案

    要编译的 Boost 版本:1.82.0 假设 Boost 的根目录为 ${boost_root}$ 如果不想编译可以使用博主编译后的Boost:https://pan.baidu.com/s/1s2 ...

  2. HUD 5773 LIS(最长上升序列)

    ***关于lower_bound()的用法参见:http://blog.csdn.net/niushuai666/article/details/6734403 lower_bound用法:函数low ...

  3. sql语句内变量的使用

    0.原始表格如下: 1.定义变量,并在sql语句内查询: set @user_name = "成龙";SELECT * FROM `tb_user` where userName ...

  4. shell脚本(4)-格式化输入

    一.read命令 1.概念: 默认接受键盘的输入,回车符代表输入结束 2.read命令选项 -p:打印信息 -t:限定时间 -s:不回显 -n:输入字符个数 3.举例说明 (1)模拟登录 [root@ ...

  5. java进阶(16)--System常用方法总结

    一.Systen.out静态变量 静态变量,用的最多的是调用print方法   二.System.out.println() println()其实是printStream类的方法   三.Sytem ...

  6. 机器学习-线性分类-支持向量机SVM-SMO算法代码实现-15

    1. alpha2 的修剪 if y1 != y2 : α1 - α2 = k # 不用算k的具体大小 if k > 0: # 上图的左 下这条线 α2 的区间 (0, c-k) k < ...

  7. 到底什么样的 Java 项目用 Solon 好???

    什么样的 Java 项目用 Solon 好 就像华为讲的,不要因为爱国而特意买华为手机.Solon 也是,有需要就用不需要就跳过(按正常的需求选择): 信创需要国产化,应该用 Solon 或者 Sol ...

  8. P5733 【深基6.例1】自动修正

    1.题目介绍 2. 题解 2.1 字符串大小写转换 思路 str[i] -= 'a' -'A'; 注意这里转换方式,即减去偏移量(ASCII码表中,'a'在'A'前面,如果记不得偏移量,就直接写'a' ...

  9. [java] - 数据库连接工具类

    package util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLExceptio ...

  10. css - 伪元素清除浮动

    .clearfix:after{ content:""; /*设置内容为空*/ height:0; /*高度为0*/ line-height:0; /*行高为0*/ display ...