<C++学习>C++ Boost 输入与输出教程

C++ Boost 输入与输出教程

Boost 提供了许多实用的工具来增强 C++ 的输入与输出功能,包括字符串格式化、文件操作、序列化和日志系统等。在标准 I/O 的基础上,Boost 的功能更丰富、更灵活,能够满足复杂的 I/O 场景需求。


1. Boost 中与 I/O 相关的主要库

1.1 Boost.Format

  • 提供类似 C 风格 printf 的格式化功能,但更安全灵活。
  • 支持类型检查和链式操作。

1.2 Boost.Filesystem

  • 提供跨平台的文件和目录操作。
  • 支持路径解析、文件状态查询等。

1.3 Boost.Serialization

  • 提供序列化功能,将对象保存到文件或网络流中。
  • 支持 XML、文本和二进制格式。

1.4 Boost.Log

  • 强大的日志系统,支持多种日志级别和目标。

2. Boost.Format

Boost.Format 提供了灵活的格式化字符串功能,可以替代传统的 printf

示例:基本格式化

cpp 复制代码
#include <boost/format.hpp>
#include <iostream>

int main() {
    std::string name = "Alice";
    int age = 25;

    // 使用 boost::format 进行格式化
    std::cout << boost::format("Name: %s, Age: %d") % name % age << std::endl;

    // 链式操作
    std::cout << boost::format("%1% + %2% = %3%") % 10 % 20 % (10 + 20) << std::endl;

    return 0;
}
输出
Name: Alice, Age: 25
10 + 20 = 30

常见功能

  • 占位符编号%1%, %2% 表示参数顺序。

  • 指定宽度和填充

    cpp 复制代码
    std::cout << boost::format("|%1$10s|%2$-10d|") % "Alice" % 42 << std::endl;

    输出:

    |     Alice|42        |
    

3. Boost.Filesystem

Boost.Filesystem 提供了跨平台的文件和目录操作。其核心是 boost::filesystem::path 和相关函数。

3.1 基本使用

示例:路径解析
cpp 复制代码
#include <boost/filesystem.hpp>
#include <iostream>

namespace fs = boost::filesystem;

int main() {
    fs::path path = "/tmp/test.txt";

    // 路径信息
    std::cout << "Path: " << path << std::endl;
    std::cout << "Filename: " << path.filename() << std::endl;
    std::cout << "Parent Path: " << path.parent_path() << std::endl;
    std::cout << "Extension: " << path.extension() << std::endl;

    return 0;
}
输出
Path: /tmp/test.txt
Filename: test.txt
Parent Path: /tmp
Extension: .txt

3.2 文件与目录操作

示例:文件状态查询
cpp 复制代码
#include <boost/filesystem.hpp>
#include <iostream>

namespace fs = boost::filesystem;

int main() {
    fs::path path = "/tmp/test.txt";

    if (fs::exists(path)) {
        std::cout << path << " exists!" << std::endl;
        if (fs::is_regular_file(path)) {
            std::cout << path << " is a regular file." << std::endl;
        } else if (fs::is_directory(path)) {
            std::cout << path << " is a directory." << std::endl;
        }
    } else {
        std::cout << path << " does not exist!" << std::endl;
    }

    return 0;
}

示例:创建目录和文件
cpp 复制代码
#include <boost/filesystem.hpp>
#include <iostream>

namespace fs = boost::filesystem;

int main() {
    fs::path dir = "/tmp/new_directory";

    // 创建目录
    if (!fs::exists(dir)) {
        fs::create_directory(dir);
        std::cout << "Directory created: " << dir << std::endl;
    }

    // 删除目录
    fs::remove(dir);
    std::cout << "Directory removed: " << dir << std::endl;

    return 0;
}

4. Boost.Serialization

Boost.Serialization 提供了序列化和反序列化功能,可用于将对象存储到文件或网络中。

4.1 基本序列化

示例:序列化到文件
cpp 复制代码
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <fstream>
#include <iostream>

class Person {
    friend class boost::serialization::access;

    std::string name;
    int age;

    template <class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & name & age;
    }

public:
    Person() = default;
    Person(std::string n, int a) : name(n), age(a) {}

    void print() const {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }
};

int main() {
    {
        // 序列化
        Person p("Alice", 25);
        std::ofstream ofs("person.txt");
        boost::archive::text_oarchive oa(ofs);
        oa << p;
    }

    {
        // 反序列化
        Person p;
        std::ifstream ifs("person.txt");
        boost::archive::text_iarchive ia(ifs);
        ia >> p;
        p.print();
    }

    return 0;
}

4.2 支持的格式

  • 文本格式boost::archive::text_oarchive
  • 二进制格式boost::archive::binary_oarchive
  • XML 格式boost::archive::xml_oarchive

5. Boost.Log

Boost.Log 提供了强大的日志系统,支持多种日志级别、目标和格式。

5.1 基本日志功能

示例:输出日志
cpp 复制代码
#include <boost/log/trivial.hpp>
#include <iostream>

int main() {
    BOOST_LOG_TRIVIAL(info) << "This is an info message.";
    BOOST_LOG_TRIVIAL(warning) << "This is a warning message.";
    BOOST_LOG_TRIVIAL(error) << "This is an error message.";

    return 0;
}
输出
[info] This is an info message.
[warning] This is a warning message.
[error] This is an error message.

5.2 自定义日志格式

Boost.Log 支持自定义日志级别和格式,适用于复杂日志记录需求。


6. 示例:综合应用

以下示例展示如何使用 Boost 实现文件操作、格式化输出和序列化的综合应用。

完整代码
cpp 复制代码
#include <boost/format.hpp>
#include <boost/filesystem.hpp>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <iostream>
#include <fstream>

namespace fs = boost::filesystem;

// Person 类用于序列化
class Person {
    friend class boost::serialization::access;

    std::string name;
    int age;

    template <class Archive>
    void serialize(Archive& ar, const unsigned int version) {
        ar & name & age;
    }

public:
    Person() = default;
    Person(std::string n, int a) : name(n), age(a) {}

    void print() const {
        std::cout << "Name: " << name << ", Age: " << age << std::endl;
    }
};

int main() {
    fs::path dir = "./data";
    if (!fs::exists(dir)) {
        fs::create_directory(dir);
        std::cout << boost::format("Directory '%1%' created.") % dir << std::endl;
    }

    fs::path file = dir / "person.txt";

    // 序列化
    Person p("Alice", 30);
    {
        std::ofstream ofs(file.string());
        boost::archive::text_oarchive oa(ofs);
        oa << p;
        std::cout << boost::format("Data serialized to '%1%'") % file << std::endl;
    }

    // 反序列化
    {
        Person p2;
        std::ifstream ifs(file.string());
        boost::archive::text_iarchive ia(ifs);
        ia >> p2;
        p2.print();
    }

    return 0;
}

总结

Boost 提供了强大的输入输出扩展功能,包括:

  1. Boost.Format:灵活的字符串格式化。
  2. Boost.Filesystem:跨平台文件操作。
  3. Boost.Serialization:对象序列化。
  4. Boost.Log:高效日志系统。

通过这些工具,可以大大简化和增强 C++ 中的 I/O 操作,适合复杂项目需求。

相关推荐
KeyPan3 小时前
【Ubuntu与Linux操作系统:十、C/C++编程】
linux·运维·服务器·c语言·c++·算法·ubuntu
我想学LINUX5 小时前
【2024年华为OD机试】 (C卷,100分)- 消消乐游戏(Java & JS & Python&C/C++)
java·c语言·javascript·c++·游戏·华为od
skywalk81636 小时前
C语言基本知识复习浓缩版:数组
c语言·数据结构·c++·算法
GHL2842710907 小时前
面试:类模版中函数声明在.h,定义在.cpp中,其他cpp引用引入这个头文件,会有什么错误?
c++·学习
Victoria.a8 小时前
数据在内存的存储
c语言·c++
#include>8 小时前
【C++boost::asio网络编程】使用asio协程搭建异步echo服务器的笔记
服务器·网络·c++
arong_xu8 小时前
深入解析 C++ 类型转换
开发语言·c++·类型转换·casting
labuladuo5208 小时前
洛谷 P3435 [POI2006] OKR-Periods of Words(扩展KMP+线段树做法)
数据结构·c++·算法
不想睡觉_9 小时前
21天学通C++第八章——指针
开发语言·c++