c++ - 如何使用带有一个填充空间的 std:out setfill std::setw std:right 格式化文本

标签 c++ unicode cout windows-console setw

我只想格式化一个字符串和一个右对齐的整数值。 如果整数值前没有前导空格,这样做是没有问题的。

bytes.....................123981
total bytes..............1030131 

但它应该是这样的:

bytes ................... 123981
total bytes ............ 1030131

不幸的是,下面的示例无法运行,因为setw(右对齐)仅与下一个流元素相关。

int iBytes = 123981;
int iTotalBytes = 1030131;
cout << setfill('.');
cout << right;
cout << "bytes " << setw(20) << " " << iBytes << endl;
cout << "total bytes " << setw(14) << " " << iTotalBytes << endl;

我几乎从不使用 std::cout,那么有没有一种简单的方法可以做到这一点而无需事先将空格字符连接到值?

最佳答案

最简单的方法是将您的“”和值写入 std::stringstream 并将生成的 str() 写入您的输出流,如:

std::stringstream ss;
ss << " " << iBytes;
cout << "bytes " << setw(20) << ss.str() << endl;

这里完全矫枉过正了。一个模板类前缀,可以打印并将两个构造函数参数 prefix,val 捆绑到一个要打印的字符串中。数字格式,精度取自最终输出流。适用于整数、 float 、字符串和 const char *。并且应该与每个具有有效输出运算符的参数一起使用。

#include <fstream> 
#include <iostream> 
#include <iomanip> 
#include <sstream> 

using  namespace std; 

template<class T> 
class prefixed_base  { 
public: 
    prefixed_base(const std::string & prefix,const T val) : _p(prefix),_t(val) { 
    } 
protected: 
    std::string _p; 
    T           _t; 
}; 

// Specialization for const char *
template<> 
class prefixed_base<const char*>  { 
public: 
    prefixed_base(const std::string & prefix,const char * val) : _p(prefix),_t(val) { 
    } 
protected: 
    std::string _p; 
    std::string _t; 
}; 

template<class T> 
class prefixed : public  prefixed_base<T> { 
private: 
    typedef prefixed_base<T> super; 
public: 
    prefixed(const std::string & prefix,const T val) : super(prefix,val) { 
    } 

    // Output the prefixed value to an ostream
    // Write into a stringstream and copy most of the
    // formats from os.

    std::ostream & operator()(std::ostream & os) const { 
        std::stringstream ss; 

        // We 'inherit' all formats from the 
        // target stream except with. This Way we 
        // keep informations like hex,dec,fixed,precision 

        ss.copyfmt(os); 
        ss << std::setw(0); 
        ss << super::_p; 

        ss.copyfmt(os); 
        ss << std::setw(0); 
        ss << super::_t; 

        return os << ss.str(); 
    } 
}; 

// Output operator for class prefixed
template<class T> 
std::ostream & operator<<(std::ostream & os,const prefixed<T> & p) { 
    return p(os); 
} 

// This function can be used directly for output like os << with_prefix(" ",33.3)
template<class T> 
prefixed<T>    with_prefix(const std::string & p,const T  v) { 
    return prefixed<T>(p,v); 
} 

int main() { 
    int iBytes = 123981; 
    int iTotalBytes = 1030131; 
    cout << setfill('.'); 
    cout << right; 

    cout << "bytes " << setw(20) << with_prefix(" ",iBytes) << endl; 
    cout << "total bytes " << setw(14) << with_prefix(" ",iTotalBytes) << endl; 

    cout << "bla#1 "       << setw(20) <<  std::fixed << std::setprecision(9) << with_prefix(" ",220.55)      << endl; 
    cout << "blablabla#2 " << setw(14) <<  std::hex << with_prefix(" ",iTotalBytes) << endl; 
} 

关于c++ - 如何使用带有一个填充空间的 std:out setfill std::setw std:right 格式化文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26959517/

相关文章:

c++ - 我无法在以下代码中打印 double 值?

C++ 串联哎呀

java - 如何在 Java 中读取/获取表情符号的 unicode 值

swift - 如何在 Swift 中生成一个随机的 unicode 字符?

c++ - 等效于 C++ iostream 的 StreamReader.ReadToEnd()

c++ - ld : symbol(s) not found for architecture x86_64 on OSX 10. 9

c# - 无法读取 C# 中的 UNICODE URL

c++ - 为什么输出的每一行之前都有不必要的空格?

c++ - std::cout 的重定向范围

c++ - 了解对象初始化