是实现定义还是标准建议流的默认填充字符?
示例代码:
#include <iostream> #include <iomanip> #include <sstream> int main () { std::stringstream stream; stream << std::setw( 10 ) << 25 << std::endl; std::cout << stream.str() << std::endl; }
使用clang –stdlib = libstdc
$clang++ --stdlib=libstdc++ test.cpp $./a.out | hexdump 0000000 20 20 20 20 20 20 20 20 32 35 0a 0a 000000c $
使用clang –stdlib = libc
$clang++ --stdlib=libc++ test.cpp $./a.out | hexdump 0000000 ff ff ff ff ff ff ff ff 32 35 0a 0a 000000c
版
$clang++ --version Apple LLVM version 4.2 (clang-425.0.28) (based on LLVM 3.2svn) Target: x86_64-apple-darwin12.5.0 Thread model: posix
我能用std :: setfill(”)修复它,但我很想知道它是否是一个clang bug.
解决方法
根据27.5.5.2 [basic.ios.cons]第3段/表128,流s的默认填充字符是s.widen(”).然而,s.widen(”)产生的字符是依赖的在st. :: locale上的s.widen(c)是(27.5.5.3 [basic.ios.members]第12段):
std::use_facet<std::ctype<cT>>(s.getloc()).widen(c)
顺便说一下,当你只写入流时你应该使用std :: ostringstream,而且有7000个.