Что такое по умолчанию «символ заполнения» в std :: stringstream?

Это определяется реализацией, или стандарты предлагают использовать символ заливки по умолчанию для потоков?

Образец кода:

#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 ошибка.

7

Решение

Символ заполнения по умолчанию для потока s является s.widen(' ') в соответствии с 27.5.5.2 [basic.ios.cons] параграф 3 / Таблица 128. Какой символ получается из s.widen(' ') однако зависит от std::locale как s.widen(c) является (27.5.5.3 [basic.ios.members] пункт 12):

std::use_facet<std::ctype<cT>>(s.getloc()).widen(c)

Кстати, вы должны использовать std::ostringstream когда вы пишете только в поток и есть не использовать std::endl Когда-либо.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]