关于c++对文件读写的封装
namespace
{
UINT_T GetWriteSizeForNoBuf(UINT_T fsize)
{
UINT_T write_buf_size = ;
if (fsize % == )
{
write_buf_size = fsize;
}
else
{
write_buf_size = (fsize / + )* ;
}
return write_buf_size;
} } //将文件解析成路径,名称,类型
bool CFileBak::ParseFilePath(const string& file_path_name, string& file_path, string& file_name, string& file_type)
{
size_t path_pos = file_path_name.find_last_of("/\\"); // 考虑/,\两种表示路径的方法
if (path_pos == string::npos)
{
assert();
return false;
}
file_path = file_path_name.substr(, path_pos);
file_name = file_path_name.substr(path_pos + );
size_t type_pos = file_name.find_last_of(".");
if (type_pos != string::npos)
{
file_type = file_name.substr(type_pos + );
file_name = file_name.substr(, type_pos);
}
return true;
} bool CFileBak::ReadFile(std::string& buf, const std::string& file_path_name, const std::string& bak_name_tmp)
{
bool need_bak = true;
FILE* ptr_file = NULL;
size_t fsize = ;
string bak_name = bak_name_tmp;
bool tmp_false = false;
do
{
fopen_s(&ptr_file, file_path_name.c_str(), "rb");
if (NULL == ptr_file)
{
break;
} //get file size
fseek(ptr_file, , SEEK_END);
fsize = (ftell(ptr_file));
fseek(ptr_file, , SEEK_SET);
if (fsize == )
{
fclose(ptr_file);
ptr_file = NULL;
break;
}
need_bak = false;
} while (tmp_false); if (need_bak)
{
//assert(0); // 已经属于异常范畴了
if (bak_name.empty())
{
string file_path;
string file_name;
string file_type;
if (!ParseFilePath(file_path_name, file_path, file_name, file_type))
{
assert();
return false;
}
bak_name = file_path + "/" + file_name + ".data";
} fopen_s(&ptr_file, bak_name.c_str(), "rb");
if (NULL == ptr_file)
{
//assert(0);
return false;
} //get file size
fseek(ptr_file, , SEEK_END);
fsize = (ftell(ptr_file));
fseek(ptr_file, , SEEK_SET);
}
if (nullptr == ptr_file)
{
assert();
return false;
} if ( == fsize)
{
assert();
fclose(ptr_file);
return false;
} auto_ptr<char> pBuf(new char[fsize]);
memset(pBuf.get(), , fsize);
size_t read_size = fread(pBuf.get(), , fsize, ptr_file);
fclose(ptr_file);
buf.assign(pBuf.get(), read_size);
//buf = string(pBuf.get(), read_size); size_t n_pos = buf.find_last_not_of('\n');
if (string::npos != n_pos)
{
buf = buf.substr(, n_pos + );
}
return true;
} bool CFileBak::WriteFile(const std::string& file_name, const std::string& buf)
{
HANDLE hfile = CreateFileA(file_name.c_str(), GENERIC_WRITE | GENERIC_READ, , , OPEN_ALWAYS, FILE_FLAG_NO_BUFFERING, );
if (INVALID_HANDLE_VALUE == hfile)
{
assert();
CloseHandle(hfile);
return false;
} LARGE_INTEGER large_file_size;
if (!GetFileSizeEx(hfile, &large_file_size))
{
assert();
CloseHandle(hfile);
return false;
}
size_t n_pos = buf.find_last_not_of('\n'); string write_buf;
if (string::npos != n_pos)
{
write_buf = buf.substr(, n_pos + );
}
else
{
write_buf = buf;
}
UINT_T write_size = GetWriteSizeForNoBuf(max(large_file_size.LowPart, static_cast<UINT_T>(write_buf.length())));
if (write_size == )
{
assert();
CloseHandle(hfile);
return false;
} auto_ptr<char> ptr_write_buf(new char[write_size]);
memset(ptr_write_buf.get(), '\n', write_size); // 将换行写在文件中不影响使用,写0都会影响xml的功能
memcpy(ptr_write_buf.get(), write_buf.c_str(), write_buf.length()); DWORD dwret = ;
::WriteFile(hfile, ptr_write_buf.get(), write_size, &dwret, NULL);
CloseHandle(hfile);
return true;
}
关于c++对文件读写的封装的更多相关文章
- php文件操作(最后进行文件常用函数封装)
文件信息相关API $filename="./1-file.php"; //filetype($filename):获取文件的类型,返回的是文件的类型 echo '文件类型为:', ...
- JS封装插件:实现文件读写功能
scripting.FileSystemObject是一个可以实现文件读写的COM组件,由于COM组件可以被跨语言调用,因此可以选择像vbs或者JS这种脚本语言调用,下面我就使用该COM组件封装了一个 ...
- java 对txt文件读写(已经封装好)
读文件: public static String readTxt(String txtPath) { File file = new File(txtPath); if(file.isFile() ...
- .net学习笔记--文件读写的几种方式
在.net中有很多有用的类库来读写硬盘上的文件 一般比较常用的有: File:1.什么时候使用:当读写件大小不大,同时可以一次性进行读写操作的时候使用 2.不同的方式可以读写文件类型不 ...
- Python之文件读写
本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...
- Linux文件读写机制及优化方式
导读 Linux是一个可控性强的,安全高效的操作系统.本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只 ...
- iOS数据持久化文件读写之偏好设置
很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能.每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如, ...
- (转)linux文件读写的流程
转自http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0 在<linux内核虚拟文件系统浅析>这篇文章中,我们看到文件是如何被打开 ...
- Linux高级编程--05.文件读写
缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...
随机推荐
- PIE 支持项目介绍
目前PIE SDK已经支持了气象.海洋.农业.水利.测绘等多个行业应用. [气象应用-和WebGIS程序界面结合] [气象应用-积雪监测] [气象应用-洪涝监测] [气象应用-专题模板] [气象应用- ...
- PIE SDK反距离权重插值算法
1.算法功能简介 反距离权重 (IDW) 插值使用一组采样点的线性权重组合来确定像元值.权重是一种反距离函数.进行插值处理的表面应当是具有局部因变量的表面.此方法假定所映射的变量因受到与其采样位置 ...
- 踩坑--springboot打war包
springboot需要jdk1.8+tomcat8.0 第一步:从IDEA中通过maven install将项目打成war包 第二步:将war包放在tomcat的webApp目录下,启动tomcat ...
- 使用jxl读取excel内容,并转换成Json,用于Datagrid
一.上传excel文件,得到InputStream,由InputStream得到Jxl中的Workbook,取出内容,存到二维数组中. 1.使用 Jquery Uploadify 插件(http:// ...
- git本地创建新分支并推送到远程仓库
1,在当前项目目录,从已有的分支创建新的分支(如从master分支),创建一个dev分支 git checkout -b dev 2,创建完可以查看一下,分支已经切换到dev git branch * ...
- 浅谈前端与SEO
转载地址: https://blog.csdn.net/lzm18064126848/article/details/53385274?tdsourcetag=s_pctim_aiomsg SEO(S ...
- CSS气泡
气泡状文本框,是一种很生动的网页设计手段. 它可以用来表示用户的发言. 也可以用来作为特定信息的提示符. DVD租借网站Netflix,还用它显示碟片的详细信息. ================== ...
- hibernate注解JPA
1.JPA与hibernate 什么是JPA ? java persistence api :java持久化api,同一的ORM规范,是由sun公司指定的规范接口,hibernate实现了JPA规范. ...
- C#程序执行时间
Stopwatch类 using System.Diagnostics; static void Main(string[] args) { Stopwatch stopWatch = new Sto ...
- Ling之select
select用法: 1.Dictionary<string, string>转json Newtonsoft.Json.JsonConvert.SerializeObject(dicSub ...