- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在寻找一个类似于 iostreams 的库,因为它执行转换,并允许写入内存缓冲区、文件和控制台。但是,我想要一些类型安全的东西,就像 iostream 一样。有没有真正的图书馆可以做到这一点?
能够为事物指定输出编码将是一个加分项。
请注意,我对仅将 iostream 放在前面的库不感兴趣,因为它们只会为 iostream 所做的事情增加更多复杂性,例如boost::format
.
PreEmptive 评论响应:我不想使用 cstdio,因为使用该系统不可能让代码与输出位置无关。也就是说,您必须调用一个函数将内容发送到缓冲区,您必须调用另一个函数将内容发送到文件,以及另一个用于控制台等。
EDIT2:针对下面的一连串评论:我厌倦了 iostreams 和 cstdio。以下是更具体的原因。我试图将我的“咆哮”排除在这个问题之外,但人们一直在问我是否已经摇摆不定,所以这就是我的理由。
vsnprintf
)才能使用(编辑:好的,现在 C++11 中的 C99 标准库添加了大部分/所有这些)我喜欢概念上的 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} 的显着特点:
在编译时可选地报告格式字符串错误的类型和内存安全。
可扩展性:用户可以为其类型编写格式化程序,包括自定义格式规范解析器(如在 Python 中)。
紧凑的二进制代码。上面的打印示例编译为:
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 好很多。
性能:{fmt} 比 printf
和 iostreams
的常见实现快得多。以下是使用 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/
在 C++ 中包含头文件时,和...有什么区别 在 <> 标志中包含 .h 部分与不包括 .h 部分? #include 与 #include 将标题名称用双引号括起来还是用 符号括起来? #inc
最近我在阅读 Accelerated C++ 并从练习答案中发现了这个有趣的代码。这是完整的代码, #include "stdafx.h" #include "4_4.h" #include usi
我正在开发一个需要能够在标准 C++ 编译器和准标准编译器上编译的实用程序。代码可以而且将会被扔到几乎任何现有的 C++ 编译器上。 我正在寻找一种可靠且可移植地确定目标编译器是否支持带或不带 .h
如果有一个文件 foo.cpp,那么它通常有一个关联的头文件 foo.h,其中包含 foo.cpp 中定义的函数的所有声明。这样,所有其他使用 foo.cpp 中的函数的文件都可以只包含 foo.h
iostream 和 iostream.h 有什么区别? 最佳答案 iostream.h 已被提供它的编译器弃用,iostream 是 C++ 标准的一部分。 为了明确说明,当前 C++ 标准 (IN
我知道关于 之间的区别的问题和 之前有人问过。阅读这些答案后,我发现了以下差异 当然iostream.h已弃用,新的符合标准的编译器不支持它 iostream.h不包含 std 中的所有内容命名
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Difference between iostream and iostream.h 我的教授说了以下内容:
我需要构建一些我在办公室电脑上得到的旧代码,它有 gcc 4.4.5安装。我编辑了代码(删除 .h 或添加类似 的内容)以使它们保持最新,以便它们可以由 gcc 4.4.5 编译.但是,在看似成功编
我在学习C++的时候遇到了一个问题,在编译的时候遇到了错误。 详情如下: 最佳答案 您似乎没有在 MinGW 中安装 C++ 支持。如果您使用手动安装路径,请下载 gcc-c++ dev、dll 和
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: What is the difference between #include and #include
对于我当前的任务,我需要能够读/写(主要是基于文件的)比特流。虽然如果用标准 C/C++ 编码,这或多或少是一项微不足道的任务,但我喜欢通过重载和使用更通用的方法重写代码标准的 STL iostrea
这个问题在这里已经有了答案: Difference between iostream and iostream.h (3 个答案) 关闭 9 年前。 有什么区别 #include 和 #inclu
我正在尝试为 linux/MacOS 转换一个用 C++14 编写的应用程序。它使用 boost::filesystem,但不用于某些 iostream 操作。例如: boost::filesyste
示例: namespace boostio = boost::iostreams; boostio::stream memStream(arr); while (!memStream.eof())
我编写了以下简单的 C++ 程序: #include using namespace std; int main() { cout ^~~~~~~~~~ 1 error
我想在我的代码中将流公开为它们的标准等价物,以消除用户对 boost::iostreams 的依赖性.如果有必要,当然想有效地执行此操作而无需创建拷贝。我考虑过只设置 std::istream的缓冲区
#include in header files and #include only in cpp files 被认为是最佳实践。我正在尝试将大量 #include 从 header 移动到现有
#include #include #include #include using namespace std; int main() { int ival; while(ci
假设我得到一个 stringbuf,其中包含一些必须删除的特定字符序列的内容: std::stringbuf string_buff; std::iostream io_stream (&string
我有一个包含如下记录的文件 123 Tag 现在是所有好人都来帮忙的时候了 总是有一个数字和一些标签,后面跟着一系列单词。我想将数字提取为整数,将标记提取为字符串,将句子提取为字符串。我已经使用 ge
我是一名优秀的程序员,十分优秀!