gpt4 book ai didi

c++ - IOStream 库有哪些重要的替代方案? (除了 cstdio)

转载 作者:IT老高 更新时间:2023-10-28 13:59:28 27 4
gpt4 key购买 nike

我正在寻找一个类似于 iostreams 的库,因为它执行转换,并允许写入内存缓冲区、文件和控制台。但是,我想要一些类型安全的东西,就像 iostream 一样。有没有真正的图书馆可以做到这一点?

能够为事物指定输出编码将是一个加分项。

请注意,我对仅将 iostream 放在前面的库不感兴趣,因为它们只会为 iostream 所做的事情增加更多复杂性,例如boost::format .

PreEmptive 评论响应:我不想使用 cstdio,因为使用该系统不可能让代码与输出位置无关。也就是说,您必须调用一个函数将内容发送到缓冲区,您必须调用另一个函数将内容发送到文件,以及另一个用于控制台等。

EDIT2:针对下面的一连串评论:我厌倦了 iostreams 和 cstdio。以下是更具体的原因。我试图将我的“咆哮”排除在这个问题之外,但人们一直在问我是否已经摇摆不定,所以这就是我的理由。

cstdio

  • 无法正确处理 Unicode 字符
  • 如果不进行手动缓冲区管理,就无法写入字符串之类的内容
  • 通常需要支持非标准扩展(例如 vsnprintf )才能使用(编辑:好的,现在 C++11 中的 C99 标准库添加了大部分/所有这些)
  • 在不改变原始代码的情况下无法改变输出的位置(非标准扩展,例如在 glibc 中允许您将文件指针视为缓冲区,这是什么...但它仍然只是一个非标准扩展)
  • 让安全变得“有趣”(以至于整个章节都专门用于解释问题的安全文档,例如使用“printf”的格式字符串等)
  • 输入不安全

iostreams

  • 对客户来说太复杂了。如果您只使用标准库附带的内容,那就太好了,但尝试扩展内容几乎是不可能的。我阅读了整本“Standard C++ IOStreams and Locales”一书——似乎唯一一本关于该主题的书——两次——我仍然不知道发生了什么。

我喜欢概念上的 iostream,甚至使用 operator<<有些人似乎不喜欢,但对我来说,这似乎完全是过度设计的。某人不应该为了成为您图书馆的简单客户而花费无数小时阅读书籍。当然,如果您要添加新的输出源或类似的东西,我可以理解,但是....客户应该避免这种复杂性。 (这不就是图书馆的用途吗?)

这是关于 C++ 中唯一一个在其他编程语言中“正常工作”的痛苦的事情,我认为没有理由变得复杂。

最佳答案

The {fmt} library : 我刚从 YouTube talk 偶然发现它而且看起来还不错。

基于 {fmt} 的格式化工具已被提议用于 C++20 中的标准化:P0645 . P0645 和 {fmt} 都使用类似于 Python 的格式字符串语法,它类似于 printf,但使用 {} 作为分隔符而不是 %.

例如

#include <fmt/core.h>

int main() {
fmt::print("The answer is {}.", 42);
}

打印“答案是 42”。到 stdout.

为 C++20 提出的 std::format 函数:

#include <format>

int main() {
std::string s = std::format("The answer is {}.", 42);
}

{fmt} 的显着特点:

  1. 在编译时可选地报告格式字符串错误的类型和内存安全。

  2. 可扩展性:用户可以为其类型编写格式化程序,包括自定义格式规范解析器(如在 Python 中)。

  3. 紧凑的二进制代码。上面的打印示例编译为:

    main: # @main
    sub rsp, 24
    mov qword ptr [rsp], 42
    mov rcx, rsp
    mov edi, offset .L.str
    mov esi, 17
    mov edx, 2
    call fmt::v5::vprint(fmt::v5::basic_string_view<char>, fmt::v5::format_args)
    xor eax, eax
    add rsp, 24
    ret
    .L.str:
    .asciz "The answer is {}."

    printf 相当,比 iostreams 好很多。

  4. 性能:{fmt} 比 printfiostreams 的常见实现快得多。以下是使用 clang 在 macOS 上进行的 tinyformat 基准测试的结果:

    ================= ============= ===========
    Library Method Run Time, s
    ================= ============= ===========
    libc printf 1.01
    libc++ std::ostream 3.04
    {fmt} 1632f72 fmt::print 0.86
    tinyformat 2.0.1 tfm::printf 3.23
    Boost Format 1.67 boost::format 7.98
    Folly Format folly::format 2.23
    ================= ============= ===========

关于c++ - IOStream 库有哪些重要的替代方案? (除了 cstdio),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6171360/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com