C++如何遍历文件夹?

C++如何遍历文件夹?,第1张

标准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 时可以设置其最大大小。

提供的一些方法:

本身可以作为数据输入/输出传递给对应发送/接收接口:

写入示例:

读取示例:

字节遍历示例:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12257590.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存