了解 Boost Filesystem Library
boost库的介绍

Boost是什么?一套开放源代码、高度可移植的C++库。
谁发起的?C++标准委员会库工作组。
所以,质量保证,不怕遇到假冒伪劣产品。
Boost内容广泛,数值计算、泛型编程、元编程、平台API……不妨从容选择自己感兴趣的部分,细细品味。
有些什么呢?瞧瞧:字符串及文本处理Boost.Regex正则表达式是解决大量模式匹配问题的基础。
它们常用于处理大的字符串,子串模糊查找,按某种格式tokenize字符串,或者是基于某种规则修改字符串。
由于C++没有提供正则表达式支持,使得有些用户被迫转向其它支持正则表达式的语言,如Perl, awk, 和 sed。
Regex提供了高效和强大的正则表达式支持,基于与STL同样的前提而设计,这使得它很容易使用。
Regex已被即将发布的Library Technical Report接受。
更多的信息,请见"Library 5: Regex.".Boost.SpiritSpirit库是一个多用途的、递归的语法分析器生成框架。
有了它,你可以创建命令行分析器,甚至是语言预处理器[1]。
它允许程序员直接在C++代码里使用(近似于)EBNF的语法来指定语法规则。
分析器非常难写,对于一个特定的问题,它们很快就变得难于维护和看懂。
而Spirit解决了这些问题,而且达到了与手工制作的分析器一样或几乎一样的性能。
Boost.String_algo这是一组与字符串相关的算法。
包括很多有用的算法,用于大小写转换,空格清除,字符串分割,查找及替换,等等。
这组算法是目前C++标准库里已有功能的扩展。
Boost.Tokenizer这个库提供了把字符序列分割成记号(token)的方法。
通用的语法分析任务包括了在已分割的文本流里查找数据。
如果可以把字符序列视为多个元素的容器将很有帮助,容器中的元素被执照用户定义的规则所分割。
语法分析就成为了在这些元素上进行操作的单个任务,Tokenizer正好提供了这种功能。
WindowsMinGW安装Boost与CLion的配置

WindowsMinGW安装Boost与CLion的配置关于 boost 在 Windows 下的使⽤ gcc 安装与 CLion 的配置, 能够查到的英⽂资料都⽐较少, 踩过坑后记录⼀下.MinGW 安装 Boost下载并解压 Boost ⽂件夹到⼀个稳定的⽂件夹, 此时我的⽂件名为 boost_1_69_0.在进⾏以下⼏步之前请先把 gcc 添加⾄环境变量.在该⽂件夹⽬录下打开命令⾏, ⾸先执⾏:bootstrap gcc 如果你只安装指定的少数⼏个库, 可以使⽤:b2 --show-libraries 得到你可以在这⾥单独安装的所有库的名称. 然后你可以安装指定的某个库, 如 program_options 和 filesystem:b2 toolset=gcc --with-program_options --with-filesystem 或者你想⼀次性编译完毕, 以后就⽆需再进⾏编译:b2 toolset=gcc 以上的指令复制⾄ cmd 可直接执⾏全部编译完成的时间视处理器性能⽽定, ⼤概在⼗分钟左右.此时你可以在 boost 根⽬录下的 stage/lib ⽂件夹下看到以 a 为⽂件扩展名的静态库.CLion CMakeLists 配置 Boost⽹上搜索到的教程容易导致以下⼏个误区认为链接库的⽂件夹⽬录在 bootstrap_1_69_0/libs 下⽆法找到原因为什么⽆法成功 find_package在 Boost 的配置中, 需要指明 BOOST_ROOT, BOOST_INCLUDEDIR, BOOST_LIBRARYDIR 这三个变量. 我的 boost ⽂件夹放在 C:/Local :set(Boost_DEBUG on)set(Boost_DETAILED_FAILURE_MSG ON)#查看 Boost 配置问题所在set(BOOST_ROOT C:/Local/Boost_1_69_0)set(BOOST_INCLUDEDIR ${BOOST_ROOT})set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage/lib)find_package(Boost COMPONENTS REQUIRED program_options)提⽰ find_package 失败.查看 debug 信息:-- [ .../FindBoost.cmake:1809 ] Searching for PROGRAM_OPTIONS_LIBRARY_RELEASE: boost_program_options-mgw51-mt-1_69;boost_program_options-mgw51-mt;boost_program_options-mt-1_69;boost_program_options-mt;boost_program_options-mt;boos -- [ .../FindBoost.cmake:1862 ] Searching for PROGRAM_OPTIONS_LIBRARY_DEBUG: boost_program_options-mgw51-mt-d-1_69;boost_program_options-mgw51-mt-d;boost_program_options-mt-d-1_69;boost_program_options-mt-d;boost_program_options-m 此时对照 stage/lib ⽂件夹下的⽂件名, 发现名称为libboost_program_options-mgw51-mt-d-x64-1_69.a 或libboost_program_options-mgw51-mt-d-x32-1_69.a因此, 只需将 x64 ⽂件中的⽂件名删掉 “-x64” 即可.故在 stage ⽂件夹下新建⼀个 python3 重命名⽂件脚本:# -*- coding: utf-8 -*-# renamer.pyfrom os import listdir, renameimport refor filename in listdir('lib'):new_filename = re.sub('libboost(.*)-x64(.*).a', r'libboost\1\2.a', filename)rename('lib/' + filename, 'lib/' + new_filename)执⾏后再次进⾏ cmake, 就可以成功 find_package此时按照⽹上教程, 完整的 CMakeLists.txt 为:cmake_minimum_required(VERSION 3.13)project(dot)set(CMAKE_CXX_STANDARD 14)set(Boost_DETAILED_FAILURE_MSG ON)set(Boost_DEBUG on)set(BOOST_ROOT C:/Local/Boost_1_69_0)set(BOOST_INCLUDEDIR ${BOOST_ROOT})set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage/lib)find_package(Boost COMPONENTS REQUIRED filesystem program_options)add_executable(dot main.cpp command.h)include_directories(${BOOST_ROOT})target_link_libraries(dot ${Boost_LIBRARIES})#Boost_LIBRARIES 为 find_package ⾃动⽣成的变量 CLion 配置 Boost 完成.参考资料(编译时mingw位数需要与系统对应)。
filesystem库用法

filesystem库用法文件系统库(filesystem library)是C++17新增的标准库之一,用于简化和统一文件和目录的操作。
使用filesystem库的一般步骤如下:1. 包含头文件:`#include <filesystem>`2. 命名空间:`using namespace std::filesystem;`3. 使用库中的功能,例如:- 创建目录:`create_directory(path);`- 删除目录或文件:`remove(path);`- 拷贝或移动目录或文件:`copy(path1, path2);` 或`rename(path1, path2);`- 获取文件大小:`file_size(path);`- 判断路径是否存在:`exists(path);`- 判断是否为目录:`is_directory(path);`- 遍历目录中的文件和子目录:使用迭代器或递归函数等。
以下是一个简单的示例代码,演示了filesystem库的基本用法:```cpp#include <iostream>#include <filesystem>using namespace std::filesystem;int main() {path filePath = "path/to/file.txt";if (exists(filePath)) {if (is_directory(filePath)) {std::cout << "Path is a directory." << std::endl;} else {std::cout << "Path is a file." << std::endl;std::cout << "Size: " << file_size(filePath) << " bytes." << std::endl;}} else {std::cout << "Path does not exist." << std::endl;}return 0;}```上述代码会判断给定的路径是否存在,并输出路径类型(文件还是目录)和文件大小(如果是文件的话)。
boost::filesystem总结

boost::filesystem总结boost::filesystem是Boost C++ Libraries中的⼀个模块,主要作⽤是处理⽂件(Files)和⽬录(Directories)。
该模块提供的类boost::filesystem::path专门⽤来处理路径。
⽽且,该模块中还有很多独⽴的函数能够⽤来执⾏创建⽬录、检查⽂件是否存在等任务。
⼀、创建Paths定义路径时需要包含头⽂件boost/filesystem.hpp,并且使⽤命名空间boost::filesystem;路径的创建很简单,仅仅需要向类boost::filesystem::path()的构造器传递⼀个string;构造器的输⼊可以是⼀个没有意义的字符串,因为构造器不会去检测该路径是否是合法路径及是否存在;path对象是⼀个跨平台的路径对象。
path对象的属性有下列这些:1) path.string() 输出字符串形式的路径2) path.stem() ⽂件名,不带扩展名3) path.extension() 返回⽂件扩展名更详细的内容见。
⼆、⽂件和⽬录该部分包括下列函数:boost::filesystem::status(path) 查询⽂件或⽬录的状态,返回的是boost::filesystem::file_status类型的对象boost::filesystem::is_directory() 根据获取的状态判断是否是⽬录,返回boolboost::filesystem::is_empty() 判断是否为空boost::filesystem::is_regular_file() 根据获取的状态判断是否是普通⽂件,返回boolboost::filesystem::is_symlink() 判断符号连接(在windows系统中,后缀为lnk的⽂件为连接⽂件)boost::filesystem::exists() 判断是否存在boost::filesystem::file_size() 返回⽂件的size,按bytes计算boost::filesystem::last_write_time() 返回⽂件最后⼀次修改的时间boost::filesystem::space() 返回磁盘的总空间和剩余空间,boost::filesystem::create_directory() 创建⽬录boost::filesystem::create_directories() 递归创建整个⽬录结构boost::filesystem::remove() 删除⽬录boost::filesystem::remove_all() 递归删除整个⽬录结构boost::filesystem::rename() 重命名⽬录boost::filesystem::copy_file() 复制⽂件boost::filesystem::copy_directory() 复制⽬录boost::filesystem::absolute() 获取⽂件或⽬录的绝对路径boost::filesystem::current_path() 如果没有参数传⼊,则返回当前⼯作⽬录;否则,则将传⼊的⽬录设为当前⼯作⽬录三、⽬录迭代(Directory Iterators)boost::filesystem::directory_iterator() 迭代⽬录下的所有⽂件boost::filesystem::recursive_directory_iterator() 递归地遍历⼀个⽬录和⼦⽬录,也就是迭代整个⽬录结构下的所有⽂件四、⽂件流(File Streams)头⽂件<fstream>定义的⽂件流不能将boost::filesystem::path定义的⽬录作为参数。
boost常用库的使用介绍 第一讲

6
第五节:一个简单的测试用例
#include <vector> #include <iostream> #include <boost/foreach.hpp> #include <boost/assign.hpp> #include <boost/timer.hpp> //用于测试编译后的date_time lib是否正确 #pragma comment(lib, “libboost_date_time-vc90-mt-1_53.lib”) int main() { std::vector<int> v = (boost::assign::list_of(1),2,3,4,5); BOOST_FOREACH(int x,v) { std::cout << x << ","; } std::cout << std::endl; boost::timer t; std::cout << t.elapsed() << “ s “ << std::endl; return 0; } 编译链接通过,运行程序,说明您boost正确安装,刚才编译的date_time库也没问题,恭喜!! 7
2
第二节:安装boost库
• 登陆网站
下载boost_1_53_0.7z,大约50兆(window适用,本教程只针对windows进行讲解)。
• 将上述下载的7z压缩包解压到任意目录
例如d:\boost_1_53_0,解压后大约有450多兆。
• 解压后主要的目录如下
双击bootstrap.bat运行批处理程序。
生成b2.exe和bjam.exe这两个应用程序,bjam.exe是早期编译boost库的应用程序,我们使用b2.exe来进行编译。
boost常用库的使用介绍第一讲

boost常用库的使用介绍第一讲[object Object]Boost是一个C++库集合,包含了许多常用的工具和组件,用于增强C++的功能和性能。
Boost库广泛应用于各种领域,如网络编程、多线程、数据结构、算法等。
Boost库的使用可以大大简化C++开发过程,提高开发效率。
下面是一些常用的Boost库和它们的使用介绍:1. Boost.Filesystem:用于处理文件和目录的库。
它提供了一组易于使用和跨平台的API,可以进行文件和目录的创建、删除、移动、复制等操作。
2. Boost.Regex:正则表达式库,提供了强大的正则表达式功能,可以进行字符串匹配、替换等操作。
Boost.Regex支持多种正则表达式语法,包括Perl、ECMAScript等。
3. Boost.Thread:多线程库,提供了线程的创建、同步、互斥等功能。
Boost.Thread可以简化多线程编程,提高程序的并发性能。
4. Boost.Asio:网络编程库,提供了异步网络编程的功能。
它支持TCP、UDP、SSL等协议,可以用于开发高性能的网络应用程序。
5. Boost.SmartPtr:智能指针库,提供了shared_ptr、weak_ptr等智能指针类,用于管理动态分配的内存。
使用智能指针可以避免内存泄漏和悬挂指针等问题。
6. Boost.Algorithm:算法库,提供了一系列常用的算法,如排序、查找、字符串处理等。
Boost.Algorithm可以方便地进行各种数据处理操作。
7. Boost.Date_Time:日期和时间库,提供了日期和时间的表示、计算和格式化等功能。
它支持多种日期和时间表示方式,如Gregorian、Julian等。
8. Boost.Serialization:序列化库,用于将对象转换成字节流或从字节流中恢复对象。
Boost.Serialization可以方便地进行对象的序列化和反序列化操作。
Boost库学习指南与使用说明

Boost库学习指南与使用说明Boost库学习指南与使用说明一、简介1.1 Boost库概述1.2 Boost库的优势1.3 Boost库的应用领域二、安装与配置2.1 Boost库2.2 解压并安装Boost库2.3 设置Boost库环境变量三、常用模块介绍3.1 模块3.1.1 文件系统操作函数3.1.2 文件和目录迭代器3.2 Regex模块3.2.1 正则表达式语法3.2.2 正则表达式的使用方法3.3 Smart Pointers模块3.3.1 shared_ptr类3.3.2 unique_ptr类3.4 Thread模块3.4.1 线程的创建与管理3.4.2 线程同步与互斥四、常见问题与解决方案4.1 Boost库的兼容性问题4.2 Boost库的编译问题4.3 Boost库的运行时问题五、实例与案例分析5.1 使用模块进行文件操作5.2 使用Regex模块进行字符串匹配5.3 使用Smart Pointers模块管理动态内存 5.4 使用Thread模块实现并行计算附件:1: Boost库官方文档(boost_documentation:pdf)2: Boost库示例代码(boost_examples:zip)注释:1: Boost库:一个由C++标准库扩展而来的开源C++库,提供了大量的功能模块,广泛应用于软件开发领域。
2:环境变量:操作系统中存储了一些用于指定操作系统运行环境的参数值的特殊变量。
3:迭代器:访问一个容器(如数组、列表、集合等)中的元素的指针或引用。
4:正则表达式:一种描述字符串模式的语法规则,用于进行字符串的匹配和替换等操作。
5:共享指针:一种智能指针,允许多个指针共享同一个对象,并在所有共享指针都释放对象后自动销毁对象。
6:独占指针:一种智能指针,采用独占所有权的方式管理动态分配的对象,并在指针被销毁时自动释放对象。
7:线程:一个独立的执行路径,可以同时进行多个线程的执行,实现程序的并发执行。
boost 编译参数

boost 编译参数boost是一个开源的C++库,提供了丰富的功能和工具,用于增强C++的性能和功能。
在编译boost库时,可以使用不同的编译参数来优化编译过程和生成的代码。
本文将介绍几个常用的boost编译参数,并对其功能和用法进行详细说明。
一、--with-<library>参数--with-<library>参数用于指定需要编译的boost库。
boost库提供了很多模块,如system、filesystem、thread等,可以根据具体需求选择需要编译的模块。
例如,使用--with-system参数可以编译boost.system库,用于处理系统相关的功能。
二、--without-<library>参数--without-<library>参数用于指定不需要编译的boost库。
如果不需要某个库的功能,可以使用该参数禁用对应的库的编译。
例如,使用--without-regex参数可以禁用正则表达式库的编译。
三、--build-type参数--build-type参数用于指定编译类型,常用的取值有debug和release。
debug类型用于调试和测试,生成的代码包含调试信息;release类型用于发布,生成的代码进行了优化,更加高效。
可以根据具体需求选择编译类型。
四、--toolset参数--toolset参数用于指定编译工具集,如gcc、clang、msvc等。
不同的编译工具集有不同的编译器和选项,可以根据具体需求选择合适的编译工具集。
例如,使用--toolset=gcc可以指定使用gcc编译器进行编译。
五、--cxxflags参数--cxxflags参数用于指定额外的编译选项。
可以使用该参数添加自定义的编译选项,如优化级别、警告级别等。
例如,使用--cxxflags="-O2 -Wall"可以指定编译器使用级别为2的优化,并开启所有警告。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
了解 Boost Filesystem LibraryC++语言(实际上是C++标准)的最常见问题之一是,缺乏定义良好的库来帮助处理文件系统查询和操作。
由于这个原因,程序员不得不使用本机操作系统提供的应用程序编程接口(Application Program Interfaces,API),而这使得代码不能在平台之间移植。
以下面的简单情况为例:您需要确定某个文件是否是Directory 类型。
在Microsoft® Windows® 平台中,可以通过调用GetAttributes库函数(在windows.h 头文件中定义)进行此操作:DWORD GetFileAttributes (LPCTSTR lpFileName);对于目录,所得到的结果应该为FILE_ATTRIBUTE_DIRECTORY,而您的代码必须检查是否为此结果。
在UNIX® 和Linux® 平台上,可以通过使用stat或fstat函数及sys/stat.h 中定义的S_ISDIR 宏来实现相同的功能。
您还必须理解stat结构。
下面是对应的代码:#include <sys/stat.h>#include <stdio.h>int main(){struct stat s1;int status = stat(<const char* denoting pathname>, &s1);printf(“Path is a directory : %d\n”, S_ISDIR(s1.st_mode));return 0;}对于I/O 操作较多的程序,这样的不一致就意味着需要进行大量的工程工作才能在平台间移植代码。
正是因为这个原因,我们才引入了Boost Filesystem Library。
这个广泛使用的库提供了安全、可移植且易用的C++接口,用于执行文件系统操作。
可以从Boost站点免费下载此库。
使用boost::filesystem 的第一个程序在深入研究Boost Filesystem Library 的更多细节之前,请看一下清单1中所示的代码;此代码使用Boost API 确定某个文件的类型是否为Directory。
清单1. 用于确定某个文件的类型是否为Directory 的代码#include <stdio.h>#include “boost/filesystem.hpp”int main(){boost::filesystem::path path("/usr/local/include"); // random pathnamebool result = boost::filesystem::is_directory(path);printf(“Path is a directory : %d\n”, result);return 0;}此代码非常明了易懂,您并不需要了解任何系统特定的例程。
此代码经过验证,能在不用修改的情况下在gcc-3.4.4 和cl-13.10.3077 上成功编译。
回页首了解Boost path 对象了解Boost Filesystem Library 的关键是path对象,因为Filesystem Library 中定义的多个例程都要对相应的path对象操作。
文件系统路径通常依赖于操作系统。
例如,众所周知,UNIX 和Linux 系统使用正斜杠( /) 字符作为目录分隔符,而Windows 将反斜杠(\) 字符用于类似的用途。
boost::filesystem::path旨在准确地抽象此特性。
path对象可以通过多种方式进行初始化,最常见的方式是使用char*或std::string进行初始化,如清单2中所示。
清单2. 创建Boost path 对象的方法path(); // empty pathpath(const char* pathname);path(const std::string& pathname);path(const char* pathname, boost::filesystem::path::name_check checker);path(const char* pathname, boost::filesystem::path::name_check checker);在初始化path对象时,可以采用本机格式或可移植操作系统接口(Portable Operating System Interface,POSIX)委员会定义的可移植格式提供PATHNAME 变量。
这两种方法在实际中各有优缺点。
考虑以下情况:您希望操作软件所创建的目录,此目录在UNIX 和Linux 系统上位于/tmp/mywork,而在Windows 上位于C:\tmp\mywork。
可以采用多种方法处理问题。
清单3显示了面向本机格式的方法。
清单3. 使用本机格式初始化path#ifdef UNIXboost::filesystem::path path("/tmp/mywork");#elseboost::filesystem::path path("C:\\tmp\\mywork ");#endif需要单个#ifdef来按操作系统初始化path 对象。
不过,如果您喜欢使用可移植格式,请参见清单4。
清单4. 使用可移植格式初始化pathboost::filesystem::path path("/tmp/mywork");请注意,path::name_check指的是一个名称检查函数原型。
如果其参数输入PATHNAME 对于特定的操作系统或文件系统有效,名称检查函数将返回“True”。
Boost Filesystem Library 提供了多个名称检查函数,而且也欢迎您提供自己的变体。
常用的名称检查函数是Boost 提供的portable_posix_name和windows_name。
回页首path 成员函数概述path对象提供了多个成员方法。
这些成员例程并不会修改文件系统,但会根据path 名称提供有用的信息。
此部分提供了其中几个例程的概述:∙const std::string& string( ):此例程会返回用于初始化path 的字符串的副本,其格式符合path 语法规则。
∙std::string root_directory( ):在提供了路径的情况下,此API 将返回根目录,否则将返回空字符串。
例如,如果路径包含/tmp/var1,则此例程将返回/,即UNIX 文件系统的根。
不过,如果路径是相对路径,如../mywork/bin,此例程将返回空字符串。
∙std::string root_name( ):在给定从文件系统根目录开始的路径的情况下,此例程将返回包含PATHNAME 的第一个字符的字符串。
∙std::string leaf( ):在给定绝对路径名称(例如,/home/user1/file2)的情况下,此例程将提供与文件名称对应的字符串(即file2)。
∙std::string branch_path( ):这是与leaf互补的例程。
在给定路径的情况下,将会返回其构造所用的所有元素(除了最后一个元素)。
例如,对于使用/a/b/c初始化的path,path.branch_path( )将返回/a/b。
对于包含单个元素的路径,如c,此例程将返回空字符串。
∙bool empty( ):如果path 对象包含空字符串(例如path path1("")),则此例程将返回True。
∙boost::filesystem::path::iterator:此例程用于遍历path 的各个元素。
请看清单5所示的代码。
清单5. 使用path::iterator(begin 和end 接口)#include <iostream>#include “boost/filesystem.hpp”int main(){boost::filesystem::path path1("/usr/local/include"); // random pathnameboost::filesystem::path::iterator pathI = path1.begin();while (pathI != path1.end()){std::cout << *pathI << std::endl;++pathI;}return 0;}// result: 1上述程序的输出依次是/、usr、local、include,代表了该目录的层次结构。
∙path operator / (char* lhs, const path& rhs):此例程是path的非成员函数。
它将返回使用lhs和rhs形成的路径的串联值。
它将自动插入/作为路径分隔符,如清单6中所示。
清单6. 路径字符串的串联#include <iostream>#include “boost/filesystem.hpp”int main(){boost::filesystem::path path1("/usr/local/include"); // random pathnameboost::filesystem::path::iterator pathI = path1.begin();while (pathI != path1.end()){std::cout << *pathI << std::endl;++pathI;}return 0;}// result: 1回页首错误处理文件系统操作经常遇到意外的问题,Boost Filesystem Library 将使用C++异常报告运行时错误。
boost::filesystem_error类派生自std::runtime_error类。
库中的函数使用filesystem_error异常报告操作错误。
与不同的可能错误类型对应,Boost 头文件定义了相应的错误代码。
用户代码通常驻留在try...catch块内,使用filesystem_error异常来报告相关错误消息。
清单7提供了重命名文件的小示例,在from路径中的文件不存在时引发异常。
清单7. Boost 中的错误处理#include <iostream>#include “boost/filesystem.hpp”int main(){try {boost::filesystem::path path("C:\\src\\hdbase\\j1");boost::filesystem::path path2("C:\\src\\hdbase\\j2");boost::filesystem::rename(path, path2);}catch(boost::filesystem::filesystem_error e) {// do the needful}return 0;}回页首Boost Filesystem Library 中的函数类别boost::filesystem提供了不同类别的函数:有些函数(如is_directory)用于查询文件系统,而其他函数(如create_directory)则主动对文件系统进行修改。