2010-01-21 84 views
8

我發現,這是帶來極大的便利在C++中,而不是像ReadFile的,WriteFile的,等甚至fprintf中的Windows功能使用流。什麼時候使用流不好?何時使用流?使用流是安全的嗎?很多程序員如何不使用流?什麼時候使用C++ iostreams比ReadFile,WriteFile,fprintf等更好?

這只是我一直想知道,也許你可以擺脫一些智慧。

+2

boost :: format庫是另一種提供類型安全printf-like格式的替代方法:http://www.boost.org/doc/libs/1_41_0/libs/format/doc/format.html – Void 2010-01-21 18:30:23

+0

頻繁使用'boost :: format'可能會嚴重損害你的性能。在使用Boost 1.33的項目中,由於性能問題(使用Profiler測量),我不得不停止使用boost :: format。 – 2010-02-26 10:52:18

+0

謝謝,很高興知道。我從來沒有真正嘗試過提升,但看到它如此受歡迎,我應該在某個時候檢查一下。 – 2010-03-01 16:01:43

回答

10

什麼時候不好用流?

  • 流不能保證線程安全的。很容易想到一種情況,即無法在沒有同步的情況下使用流。
  • 流對象通常非常「沉重」。他們可能對於低內存或嵌入式環境來說太重了。

什麼時候使用流?

一般。

是否可以安全使用流?

是的,但是在異步共享流時必須小心。

爲什麼很多程序員不使用流?

偏好,風格,或他們先學會了不同的方法(或不同的語言)。我發現很多舊的「C++」在線例子都是用C語言編寫的,喜歡用printf來表示。

+0

最完整的答案,它提到了有關安全的東西。 – 2010-01-21 19:06:42

3
  1. 當你希望你的應用程序可以移植到不同的平臺。

  2. 當你想更簡潔的代碼:Win32函數具有更復雜的語義,往往需要的功能的集合做一些事情,肯定有更多的參數。

11

流通常是相當安全的。在某些情況下,他們可能會變得緩慢和/或笨拙。主要原因在於它們在代碼和操作系統之間增加了一些額外的層次,在錯誤的情況下,這些層次可能會增加開銷。這種笨拙主要與C的printf相比,並不是直接使用像WriteFile(它根本不支持格式化)的東西。例如,然而,考慮:

printf("%2.2x", ch);` 

std::cout << std::hex << std::setw(2) << std::setprecision(2) << std::setfill('0') << ch; 
std::cout << setfill(' '); 

然後考慮,如果你關心國際化,printf使用字符串,很容易從外部源,其中在讀的事實C++流將所有格式嵌入到代碼結構中,因此幾乎所有格式變化都需要重寫代碼,重新編譯和重新鏈接。

CreateFile, ReadFile等,也允許一些內存映射文件和重疊的讀寫操作,根本不支持iostreams。如果情況允許你充分利用這些,iostream往往不會有競爭力。

+2

對於那些不使用它的人來說,通常這篇文章中的「i18n」意味着「國際化」。 「i」和「n」之間有18個字符,因此是「i18n」。 – 2010-01-21 18:13:29

+0

@kevin:哎呀,很對。感謝翻譯。 – 2010-01-21 18:27:26

+0

* printf仍然不能用於i18n,因爲變量的位置和類型是硬編碼的。 – rpg 2010-01-22 10:38:59

1

我喜歡printf()的原因之一是格式字符串本身可以是資源,因此允許更多外部控制程序輸出而不強制重新編譯。

我喜歡cout()的原因之一是它的原始速度。

根據我的經驗,這往往是一個相當宗教問題。

4

你不能這樣做異步文件I/O和流...

1

一個原因是i18n

string time = "4:32"; 
cout << "the current time is " << time; 
cout << "वर्तमान समय " << time << " है।" 
cout << time << "في الوقت الحالي هو"; 

VS

string format = "the current time is %s"; 
string format = "वर्तमान समय %s है।"; 
string format = "%s في الوقت الحالي هو"; 
printf(format, time); 
1

有你所提到的三種選擇這裏:

  1. C++ str EAMS(ostream的是istream,fstream的)
  2. C STDIO(的printf,sprintf的fprintf中)
  3. 的Windows文件(ReadFile的,WriteFile的)

選項1 & 2是平臺無關。這意味着您可以編譯mac,linux或許多其他操作系統的代碼。選項3僅適用於Windows。這意味着除了Windows之外,您無法編譯它。

當決定選項1 & 2時,取決於您想如何使用它。 C語言庫更易於使用。這是一場噩夢,試圖用流中的替代語言替換文本,但是使流線程安全,將更復雜的類轉換爲可打印格式以及擴展流功能要容易得多。

C++的iostream與C的stdio是一個非常激烈的論點,在這個論壇的許多其他地方討論,如 C++ Streams vs. C-style IO?和其他地方在線。