【发布时间】:2011-02-14 13:28:27
【问题描述】:
我不喜欢在 C++ 库中使用 <iostream>。我更喜欢在<stdio.h> 中使用类似于“printf”和“scanf”的东西。
我可以在我的所有 C++ 程序中使用 Boost 的格式库来替换 <iostream> 吗?
【问题讨论】:
我不喜欢在 C++ 库中使用 <iostream>。我更喜欢在<stdio.h> 中使用类似于“printf”和“scanf”的东西。
我可以在我的所有 C++ 程序中使用 Boost 的格式库来替换 <iostream> 吗?
【问题讨论】:
Boost Format 只做格式化位。您仍然需要 iostream 才能真正让某些内容出现在屏幕上。
当然,将它们一起使用将达到与您正在寻找的printf 相同的效果。而且它在不牺牲类型安全的情况下这样做(尽管现在这不是一个大问题,因为编译器通常会警告错误的 printf 参数)。
【讨论】:
Boost.Format 适用于 ostream。你按如下方式使用它
cout << boost::format("%2% %1%") % 36 % 77;
或喜欢
string s2 = str( format("%2% %1%") % 36 % 77 );
并根据需要打印字符串。
Boost.Format 不适用于 istream。
【讨论】:
你可以继续在 C++ 中使用printf,这没有错。只需#include <cstdio> 就可以了。当然,iostream 有几个好处(类型安全是最重要的) - 所以我仍然建议切换。
【讨论】:
nothing wrong with that: printf 缺乏类型安全是不是有问题? :P
printf 的第一个参数是文字,大多数编译器都会警告潜在的类型违规。
sync_with_stdio。
printf 和 scanf 的限制在于您不能将自己的对象与它们一起使用。
如果您使用的是 C++,则需要对流有所了解,因为这是该语言的标准。在 C++ 中,您可以为自己的对象创建流运算符,并让它们与流完美配合。
当然,您可以使用 boost::format,但它只用于格式化输出。我喜欢 boost::format,它非常有用,例如,当您使用本地化(可翻译字符串)时。
【讨论】:
其他人给出的简短答案是肯定的,但在 Boost 格式中没有对应的 scanf。但是,另一种方法是使用 Boost's Spirit 库,它分别通过 Karma 和 Qi 组件具有输入和输出功能。不过,这很可能对您正在做的事情来说太过分了,因为它是一个完整的解析器/生成器实现。
【讨论】: