Задача
Его идеальное поведение: setw()
устанавливает минимальную ширину поля. Если ваш выход превышает эту длину, он написан на всю длину. Кстати, ширина будет применяться ко всем следующим выходам, пока вы не измените ее снова.
Как только о форматировании и как ostream не имеет личного вкуса о плохом alignemnt, fail()
всегда возвращает ложь ;-)
Решение
Если выход только строки, у вас есть все сила строки expression:
ss << setw(3) << n.substr(0,3) ; // set mini and maxi.
Если у вас есть много такого форматирования, а также с типами арифметических, вы могли бы рассмотреть возможность написания небольшого Ada PTER как следующее:
template <class T>
string mfixed(ostream& os, T o, int n)
{
stringstream ss;
ss.copyfmt(os); // copy ALL format flags of ostream
ss << setw(n)<< o; // set the fixed length and ouput
return ss.str().substr(0, n); // truncate
}
Вы можете использовать его очень гибко в коде:
ss << mfixed(ss, n, 3)
<< " " << mfixed(ss, 25, 4) << " " << mfixed(ss, 100000, 3)
<< " " << setprecision(2) << mfixed(ss, 1.0/3.0, 4);
Я думаю, вы, возможно, непонятый 'setw': http://en.cppreference.com/w/ cpp/io/manip/setw – taocp
Значение «установки ширины» может быть неясным, вот объяснение: http://en.cppreference.com/w/cpp/io/ios_base/width – jliv902