2012-07-31 41 views
0

我有一個相當大的vector<string>在內存中,我想寫每個string./log.txt,這裏是我如何做到這一點:格式化的東西進入文件寫入有效

ofstream ofs("./log.txt"); 
for (vector<string>::const_iterator cit = vec.begin(); cit != vec.end(); cit++) { 
    char buf[30]; 
    sprintf(buf, "%s\[email protected]\n", cit->c_str()); 
    ofs << buf; 
} 
ofs.close(); 

我關心的磁盤I/O次,它有效嗎?更好的想法是什麼?

+5

你在關心磁盤I/O。我關心公然的緩衝區溢出危險。即使這種方法比「ofs << * cit <<」--- @「;''我不會那麼做。像往常一樣,這種問題的答案是嘗試兩種方法(理智和瘋狂)和時間。 YMMV – jahhaj 2012-07-31 08:28:53

+1

我一直在閱讀你對你的答案的評論。你說的是需要格式化,但是你發佈的代碼沒有格式。我想知道,你是否認爲sprintf會將字符串截斷爲30個字符?如果是這樣,你錯了。試圖瞭解問題在這裏。 – jahhaj 2012-07-31 10:11:46

回答

2

這裏是一個混合的想法,利用這樣的事實,你並不真的需要格式化什麼:

for (/* as you have */) 
{ 
    ofs.write(cit->c_str(), cit->size()); 
    ofs.write("\[email protected]", 5); 
} 
+0

對不起,我真的需要格式化。編輯 – Alcott 2012-07-31 09:02:46

+0

@Alcott:回答編輯。 – 2012-07-31 09:27:37

1

不要使用C彎路。嘗試明顯

ofs << *cit << "\[email protected]\n"; 

這應該比你現在有更快。我懷疑,任何合理的手動調整都可以讓事情比圖書館爲你做的更快。爲什麼上面可以假設的原因比你的代碼運行得更快:

  • 一個格式化字符串沒有分析
  • 沒有複製到一個臨時緩衝區
  • 沒有找終止'\0'因爲std::string就知道了其長度

最後一點不適用於"\[email protected]\n"尚;您可以將其轉換爲std::string以獲得更多的額外性能。還有其他原因的「純C++」的代碼是更好:

  • 緩衝區溢出的任何危險
  • 嵌入在數據

磁盤I/O不應該'\0'字符沒有問題一個問題,因爲ofstreams被緩衝。因此,在將它們寫入文件之前,實現將在內存中收集許多這些字符串。即便如此,它們可能會存儲在由您的操作系統管理的緩存中,以累積更大的區塊。所以磁盤應該只能看到幾個巨大的寫入,這非常有效。

+0

對不起,我需要格式化,發佈後重新編輯。 – Alcott 2012-07-31 09:04:41

+0

@Alcott,我仍然看不需要格式化。反斜槓轉義符是字符串文字的一部分,與printf無關。如果你真的需要格式化,你可能應該用C++ iostream提供,但它非常依賴於*爲什麼*你實際上需要格式化,即什麼樣的格式。 – MvG 2012-07-31 09:25:21

0

這是否高效取決於onstream的實現而不是您的代碼。這是應該的。如果你需要更高效的流,你可以實現一個。

然而,正如其他人指出的,你的代碼是不安全的。您應該改用C++流操作符或方法。

相關問題