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++对文件读写的封装的更多相关文章

  1. php文件操作(最后进行文件常用函数封装)

    文件信息相关API $filename="./1-file.php"; //filetype($filename):获取文件的类型,返回的是文件的类型 echo '文件类型为:', ...

  2. JS封装插件:实现文件读写功能

    scripting.FileSystemObject是一个可以实现文件读写的COM组件,由于COM组件可以被跨语言调用,因此可以选择像vbs或者JS这种脚本语言调用,下面我就使用该COM组件封装了一个 ...

  3. java 对txt文件读写(已经封装好)

    读文件: public static String readTxt(String txtPath) { File file = new File(txtPath); if(file.isFile() ...

  4. .net学习笔记--文件读写的几种方式

    在.net中有很多有用的类库来读写硬盘上的文件 一般比较常用的有: File:1.什么时候使用:当读写件大小不大,同时可以一次性进行读写操作的时候使用         2.不同的方式可以读写文件类型不 ...

  5. Python之文件读写

    本节内容: I/O操作概述 文件读写实现原理与操作步骤 文件打开模式 Python文件操作步骤示例 Python文件读取相关方法 文件读写与字符编码 一.I/O操作概述 I/O在计算机中是指Input ...

  6. Linux文件读写机制及优化方式

    导读 Linux是一个可控性强的,安全高效的操作系统.本文只讨论Linux下文件的读写机制,不涉及不同读取方式如read,fread,cin等的对比,这些读取方式本质上都是调用系统api read,只 ...

  7. iOS数据持久化文件读写之偏好设置

    很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能.每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如, ...

  8. (转)linux文件读写的流程

    转自http://hi.baidu.com/_kouu/item/4e9db87580328244ef1e53d0 在<linux内核虚拟文件系统浅析>这篇文章中,我们看到文件是如何被打开 ...

  9. Linux高级编程--05.文件读写

    缓冲I/O和非缓冲I/O 文件读写主要牵涉到了如下五个操作:打开.关闭.读.写.定位.在Linux系统中,提供了两套API, 一套是C标准API:fopen.fclose.fread.fwrite.f ...

随机推荐

  1. TCP/IP网络通信-数据传输

    1.通过网络IP实现数据的传输. 2.服务器端代码  [ 服务端主要通过Socket类来创建一个监听等待客户端连接,服务端发送用send方法,接收用Receive方法] using System.Ne ...

  2. docker 创建容器时遇到的坑

    坑一.时区问题 在创建系统镜像时,比如centos,会默认最小安装,并且时区默认的是UTC 所以在下好centos的原始镜像后,最好再重新构建一个新的镜像 # 命令 docker pull cento ...

  3. zookeper集群

    1.vi zoo.cfg server.1= ip:2777:3777 server.2= ip:2888:3888 server.3= ip:2999:3999 开启防火墙端口 2.创建myid文件 ...

  4. win7与ubuntu双系统安装

    机器型号:联想V470 对系统引导一直不是很明白,导致我出现几次失败. 一直挺喜欢ubuntu的,因为,第一我感觉它比较友好,第二我初次接触linux就是ubuntu,当初还是同学帮助我wubi进行安 ...

  5. hibernate离线查询DetachedCriteria清除上次的查询条件

    1 原例概述 别名重复问题之后,我们还需要解决的问题就是: 如何清除hibernate的上次查询条件,如果不清除,将会导致上次的查询条件和下次的查询条件合并到了一起. 上次的查询条件和本次的查询条件合 ...

  6. 案例45-crm练习改写客户列表使用struts2&OGNL

    1 修改CustomerAction代码 2 修改jsp/customer/list.jsp代码 <%@ page language="java" contentType=& ...

  7. flex buider 4.6 打开设计模式(designer)时提示内存不足错误的解决办法

    先申明,此方法只适用于flex builder 4.6及以下版本, flex builder 4.7以后已经完全取消了designer功能,是没有办法补救的. 1. 首先下载APE文件,这个文件好像是 ...

  8. BNU27945——整数边直角三角形——————【简单数学推导】

    整数边直角三角形 Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class nam ...

  9. [DForm]我也来做自定义Winform之另类标题栏重绘

    据说得有楔子 按照惯例,先来几张样例图(注:为了展示窗口阴影效果,截图范围向外扩展了些,各位凭想象吧).                   还要来个序 其实,很多年没写过Winform了,前端时间在 ...

  10. UML建模—EA创建Use Case(用例图)

    用例图主要用来描述“用户.需求.系统功能单元”之间的关系.它展示了一个外部用户能够观察到的系统功能模型图. 1.新建用例图 2.用例图工具: 3.一个简单用例: 用例图所包含的元素如下: 1. Act ...