标准C++目前并没有对文件系统的直接支持——世界上的文件系统千变万化,几乎无法搞出放之四海皆准的库
不过如果局限在 Windows 和 POSIX 兼容 *** 作系统 这两类 *** 作系统的话,难度就低多了。
Boost.Filesystem 库就提供了相关工具。这个库已经被标准化,即是 ISO/IEC TS 18822:2015 标准。最新版的 GCC 和 Visual Studio 部分支持这个库。
Filesystem 库的 recursive_directory_iterator 符合你的需求。
#include <fstream>#include <iostream>
#include <experimental/filesystem> // 如果是 boost 则改为 #include <boost/filesystem.hpp>
// 如果用的是 Boost.Filesystem 则下一行改成 namespace fs = boost::filesystem
namespace fs = std::experimental::filesystem
int main()
{
for(fs::path p: fs::recursive_directory_iterator("路径"))
std::cout << p.filename() << '\n'
}
下载Boost库,这里我选择下载boost_1_55_0.zip解压boost文件到本地目录(如G:\boost_1_55_0),可以发现解压后的文件中有一个bootstrap.bat文件。
然后以管理员身份打开cmd窗口岩唤,
上述命令执行完毕后可以发现G:\boost_1_55_0下新生成了一个bjam.exe文件
在命令窗口中输入语句:bjam.exe
此过程将默认根据系统已经安装好的编译工具(VS2008,2010,2012,2013)等编译相应的Lib文件、头文件等。(此步骤大概需要圆简10分钟)
可以看到msvc 12.0,这是因为我系统中已经安装过了VS2013
msvc : 8.0是VS2005
msvc : 10.0是VS2010
msvc : 12.0是VS2012、VS2013
第5步执行成功后会有如下信息提示
至此我们已经完成了boost库的安装,下面需要配置一下VS2013了。新建一个VS2013控制台应用程序(工程名为boostest),添加如下代码
#include "stdafx.h"
#include <boost/lexical_cast.hpp>
#include <iostream>
using namespace std
int main()
{
using boost::lexical_cast
int a = lexical_cast<int>("123")
double b = lexical_cast<double>("123.0123456789")
string s0 = lexical_cast<string>(a)
string s1 = lexical_cast<string>(b)
cout <<"number: " <<a <<" " <<b <<endl
cout <<"string: " <<s0 <<" " <<s1 <<endl
int c = 0
try{
c = lexical_cast<橘枣裤int>("abcd")
}
catch (boost::bad_lexical_cast&e){
cout <<e.what() <<endl
}
return 0
}
添加boostest工程的包含目录和库目录
包含目录添加 G:\boost_1_55_0
库目录添加G:\boost_1_55_0\stage\lib
进入代码窗口编译并成功运行说明BOOST库确实已经配置成功,可以放心使用。
数据租码耐的发送与接收,均是以字节流形式进行处理的,这就需要一个内存连续的存储区域供读取、写入,其表现形式就是内存指针和内存大小, asio::buffer 就是用来表示这个存储区域的,根据功能不同,又分为可变mutable、不可变const,其定义如下:
个人的理解: asio::buffer 本身并不持有数据内容,我们可以理解为是一个适配器,用来提供给发弊春送/接受动作来进行数据 *** 作,这就是为什么在异步 *** 作时要保证数据一直有效。
asio::buffer 的目标是创建缓存对象来表示原始存储区域,其构造可以接受如下内容:
需要注意的是,一旦构造完成,其大小就已经确定了,不会进行自动增长。
Boost.Asio 提供了 asio::buffer 序列,来支持 scatter-gatter *** 作,即:
在使用序列时,会使用 boost::asio::buffers_begin 和 boost::asio::buffers_end 进行遍历,从而进行 *** 作,序列的迭代器类型为 boost::asio::const_buffer 或者 boost::asio::mutable_buffer 。
asio::buffer 本身比较简单,对其进行扩展以支持自己的buffer只能借助于序列,根据之前的理解模慎,扩展实现的类只需要包含序列要求的内容即可,譬如一个 const_buffer 要实现的如下:
asio::streambuf 是一个流缓存区,其本身包含了数据内容,这是与 asio_buffer 关键的区别点, asio::streambuf 继承自标准库的 streambuf ,也就说 asio::streambuf 可以作为流缓冲区应用于符合标准库流定义的任何流。
asio::buffer 一旦创建大小就确定了,在进行读取 *** 作时是不能自动增长的,而 asio::streambuf 是支持自动增长的,需要注意的是,自动增长也有最大大小限制,在构造 asio::streambuf 时可以设置其最大大小。
提供的一些方法:
本身可以作为数据输入/输出传递给对应发送/接收接口:
写入示例:
读取示例:
字节遍历示例:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)