簡體   English   中英

C ++ ostream格式

[英]C++ ostream formatting

我想要一個C ++類Xyz ,如下所示:

Xyz mything("/tmp/x1");

int main(int argc, char **argv) {
    mything << "Hello world";
}

導致創建文件“ / tmp / x1”,然后執行以下操作

2013-12-04 12:01 ::你好世界

寫給它。

我遇到的第一個問題是ostream對於每種可能在<<類型都有很多專門的方法。 第二個是如果我有

cout << "hello" << "world";

cout << "hello";

那么operator <<的實現被稱為"hello"需要知道語句中是否有任何內容(我該如何有效地進行if(last_in_line_of_<<)類型的構造?)。 標准cout通過具有endl對象來實現此目的。

基本上,一旦定義了類,我想用一行創建一個全局日志對象,並使用ostream操作對其進行寫入,以便將cout得到的字符串包裹在一個較大的字符串中。

由於varargs方法很痛苦,而且很多人似乎都建議不要這樣做,所以我最終還是考慮采用這種方法。

在像Python和Ruby這樣的腳本語言中,對象具有strto_s方法(或等效方法),並對其進行printformat以對其進行格式化,從而使"hello {} world".format(x)格式化一個參數,而"hello {} world".format(" ".join(x))在格式化為字符串后,使用空格加入列表,然后將其"hello {} world".format(" ".join(x))到結果字符串中。

我想知道什么是正確的C ++方法。

可以向Xyz提供流行為,使其成為操縱器並使用常規流功能:

原型為

std::ostream& logtime(std::ostream& s)
{
   /* write date and time to s */
   return s;
}

可以用作

std::cout << logtime << "text and other things" << std::endl;

如果將std :: cout替換為其他任何ostream (例如,類型為std::filestreamoutfile變量),則您將獲得完全相同的效果,但使用的操縱器可以處理任何類型的輸出流(不一定是文件)

std::ofstream outfile("file");
outfile << logtime << "text and whatever else" << std::endl;

要了解如何格式化輸出 ,請參閱cplusplus.com上“ 標准C ++庫”參考中的iomanip。

例如:

  • setfill-設置填充字符
  • setprecision-設置小數精度
  • setw-設置字段寬度

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM