【发布时间】:2011-09-04 12:12:24
【问题描述】:
我正在寻找一个类似于 iostreams 的库,因为它执行转换,并允许写入内存缓冲区、文件和控制台。但是,我想要一些类型安全的东西,就像 iostream 一样。有没有真正的图书馆可以做到这一点?
能够为事物指定输出编码将是一个加分项。
请注意,我对仅将 iostream 放在前面的库不感兴趣,因为它们只会为 iostream 所做的事情增加更多复杂性,例如boost::format.
PreEmptive 评论响应:我不想使用 cstdio,因为使用该系统不可能让代码与输出位置无关。也就是说,您必须调用一个函数将内容发送到缓冲区,并且您必须调用另一个函数将内容发送到文件,以及另一个用于控制台等。
EDIT2:针对下面一连串的 cmets:我受够了 iostreams 和 cstdio。以下是更具体的原因。我试图将我的“咆哮”排除在这个问题之外,但人们一直在问我是否已经摇摆不定,所以这就是我的理由。
cstdio
- 无法正确处理 Unicode 字符
- 如果不进行手动缓冲区管理,就无法写入字符串等内容
- 通常需要支持非标准扩展(例如
vsnprintf)才能使用(编辑:好的,现在 C99 的标准库在 C++11 中添加了大部分/所有这些) - 在不更改原始代码的情况下无法更改输出位置(非标准扩展,例如在 glibc 中允许您将文件指针视为缓冲区,这是什么...但它仍然只是一个非标准扩展)
- 让安全变得“有趣”(以至于整个章节都专门在安全文档中解释问题,例如使用“printf”的格式字符串等)
- 类型不安全
iostreams
- 慢
- 对客户来说太复杂了。如果您只使用标准库附带的内容,那就太好了,但尝试扩展内容几乎是不可能的。我阅读了整本“Standard C++ IOStreams and Locales”一书——似乎唯一一本关于该主题的书——两次——但我仍然不知道发生了什么。
我喜欢 iostreams 的概念,甚至是 operator<< 的使用,有些人似乎不喜欢,但对我来说,它似乎完全过度设计了。某人不应该为了成为您图书馆的简单客户而花费无数小时阅读书籍。当然,如果您要添加新的输出源或类似的东西,我可以理解,但是....客户应该避免这种复杂性。 (这不就是图书馆的用途吗?)
这是关于 C++ 中唯一一个在其他编程语言中“正常工作”的痛苦的事情,我认为没有理由变得复杂。
【问题讨论】:
-
性能原因常常被夸大了——实际上我发现在最近的实现中 iostream 可以胜过 stdio。另一方面,我同意 iostream 的设计不是很好,值得考虑一个更好的替代方案。
-
@Xeo:你要保存流的状态,用那些“哨兵”的东西来处理错误,检查异常说明符来决定是否抛出,不管怎样恢复流的状态什么,等等。我不想那么复杂。
-
+1 好问题,我怀疑你会得到一个好的答案。无论如何,没有什么能让你休息。
-
@Matteo 对于我了解的一点点,boost.iostreams 定义了标准 iostreams 的概念,以便于扩展它们。但我不认为他们修复了格式化输入和格式化输出地狱。
-
@jeffamaphone:是的。我喜欢其他一切——这是我不喜欢的一个特殊的图书馆。 C++ 之所以复杂是因为它很强大——像 STL 这样的很棒的库虽然表明这种复杂性是值得的。当复杂性带来灵活性时,它是值得的;但其他语言的流实现要简单得多,但同样灵活。 (公平地说,C++ 的流几乎早于其他所有人)