Boost庫基礎-字符串與文本處理(format)

format

#include <boost/format.hpp>
using namespace boost;

 用法:

#include <boost/format.hpp>
using namespace boost;

int main()
{
    cout<< format("%s:%d+%d=%d\n") %"sum" % 1 % 2 % (1+2);
    
    format fmt("(%1% + %2%) * %2% = %3%\n");
    fmt % 2 % 5;
    fmt % ((2 + 5) * 5);
    cout << fmt.str();
}

//結果
sum:1+2=3
(2 + 5) * 5 = 35
  • 代碼裏第一條語句跟printf()很像,構造函數參數是格式化字符串,使用%x來指定參數的格式,因爲參數個數不確定,format模仿了流操作符<<,重載了二元操作費operator% 作爲參數輸入符,它同樣可以串聯任意數量的參數,
因此:format(...) % a % b % c 可以理解成 format(...) << a << b << c
  • 後面3條語句演示了另一種用法, 預先創建一個格式化對象,它可以被後面的代碼多次用於格式化操作。format對象仍然用操作符%來接受被格式化的參數,可以分多次輸入(不必一次給全),但參數的數量必須滿足格式化字符串的要求。
類似於 printf("(%d + %d) * %d = %d\n", 2, 5, 5, (2 + 5)*5);

類摘要

format並不是一個真正的類,而是一個typedef,真正的實現是basic_format,它的聲明如下:

  • 構造函數可以接受C字符串或std::string,被聲明爲explicit,我們只能使用顯示構造。
  • 成員函數str()返回已經格式化好的字符串。
  • size()獲得已格式化好的字符串長度,相當於str().size()。
  • parse()清空format對象內部緩存,並改用一個新的格式化字符串。如果僅僅清空緩存,可以用clear()。
  • 重載了operator%,可以接受待格式化的任意參數。%輸入的參數個數必須恰好等於格式化字符串要求都數量,在調用字符串或clear()清空緩衝區之後,則可以再次使用%。
  • 重載流輸出操作符。

以下爲格式化語法:

除此之外,還增加了新的格式:

%|spec|:兩邊增加豎線,可以更好區分格式化選項與普通字符

//上圖中可以寫成這樣
format fmt("%|05d|\n%|-8.3f|\n%| 10s|\n%|05X|\n");

%N%:標記第N個參數,相當於佔位符,不帶任何其他都格式化選項。

高級用法:

//把格式化字符串第argN位置的輸入參數固定爲val,即使調用clear()也保持不變,除非調用
//clear_bind() 或 clear_binds();
basic_format& bind_arg(int argN,const T& val)

//取消格式化字符串第argN位置的參數綁定
basic_format& clear_bind(int argN)

//取消格式化字符串所有位置的參數綁定,並調用clear()
basic_format& clear_binds();

//設置格式化字符串第itemN位置都格式化選項,manipulator是一個boost::io::group()返回的對象
basic_format& modify_item(int itemN,T manipulator)

//它是一個模板函數,最多支持10個參數,可以設置輸入/輸出流操縱器以指定格式或輸入參數值
boost::io::group(T1 a1,...,Var const& val)

用法:

#include <iostream>
#include <boost/format.hpp>
#include <iomanip>

using namespace boost;
using boost::io::group;

int main()
{
    //聲明formatt對象,有三個輸入參數,五個格式化選項
    format fmt("%1% %2% %3% %2% %1% \n");

    std::cout << fmt %1 %2 %3;

    //將第二個輸入參數固定爲數字10
    fmt.bind_arg(2, 10);
    std::cout << fmt %1 %3;

    //清空緩衝,但綁定都參數不變
    fmt.clear();

    //在%操作符中使用group(),指定輸入/輸出流操縱符第一個參數顯示爲八進制
    std::cout << fmt % group(std::showbase, std::oct, 111) % 333;

    //清除所有綁定參數
    fmt.clear_binds();

    //設置第一個格式化項,十六進制,寬度爲8,右對齊,不足位用*填充
    fmt.modify_item(1, group(std::hex, std::right, std::showbase, std::setw(8), std::setfill('*')));

    std::cout << fmt % 49 % 20 % 100;

	getchar();
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章