C++将一个数据格式化为固定长度的字符串

本文介绍了一种在C++中生成固定长度字符串的方法,通过模板函数处理不同数据类型,包括数值和字符串,确保数据格式化后的美观性。同时,探讨了使用snprintf和stringstream结合std::setw进行格式化的技巧。

经常会遇到将数据解析为文本文件的现象,通常因为数据长度的不同导致,可视化效果不好。

写一个输入数据获取固定长度字符串的函数,来得到一个固定长度的数据,让格式化看起来好看一些。

#include <type_traits>
#include <sstream>
#include <typeinfo>
template<typename T>
std::string gen_fixed_len_str(T val, uint64_t len)
{
    std::ostringstream oss;
    if (true == std::is_arithmetic<T>::value ||
        /// std::string const std::string std::string& const std::string& 的typeid是一样的
        typeid(val).name() == typeid(std::string).name() ||
        typeid(val).name() == typeid(char*).name() ||
        typeid(val).name() == typeid(const char*).name()) {
        oss << val;
    }

    if (oss.str().size() > len) {
        return oss.str().substr(0, len);
    }
    else {
        for (std::size_t i = oss.str().size(); i < len; ++i) {
            oss << " ";
        }
    }
    return oss.str();
}

使用snprintf的格式化

snprintf使用也很方便,举个下边的简单的例子

char buf[64] = {0};
// abc 占10个字符的位置 右对齐
std::snprintf(buf, sizeof (buf), "%10s", "abc");
char buf1[64] = {0};
// abc 占10个字符的位置 左对齐
std::snprintf(buf1, sizeof (buf1), "%-10s", "abc");
    
//需要注意的是,如果字符串的长度超过了设置的宽度,那么设置的宽度就无效了。
//整型数据的输出是一样的

stringstream加上std::setw函数来实现。

    std::ostringstream oss;
    oss << std::left
        << std::setw(10) << "abc"
        << std::right
        << std::setw(15) << 100
        << std::endl;
    std::cout << oss.str();
//涉及到的头文件包括  
// #include <sstream>
// #include <ios>
// #include <iomanip>
// 如果需要不足的位置补上一些字符的话可以使用 std::setfill('0') 比如补0

这种风格的输出也很优雅。一样的问题是设置的宽度不够的时候,宽度就无效了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值