我發現,這是帶來極大的便利在C++中,而不是像ReadFile的,WriteFile的,等甚至fprintf中的Windows功能使用流。什麼時候使用流不好?何時使用流?使用流是安全的嗎?很多程序員如何不使用流?什麼時候使用C++ iostreams比ReadFile,WriteFile,fprintf等更好?
這只是我一直想知道,也許你可以擺脫一些智慧。
我發現,這是帶來極大的便利在C++中,而不是像ReadFile的,WriteFile的,等甚至fprintf中的Windows功能使用流。什麼時候使用流不好?何時使用流?使用流是安全的嗎?很多程序員如何不使用流?什麼時候使用C++ iostreams比ReadFile,WriteFile,fprintf等更好?
這只是我一直想知道,也許你可以擺脫一些智慧。
什麼時候不好用流?
什麼時候使用流?
一般。
是否可以安全使用流?
是的,但是在異步共享流時必須小心。
爲什麼很多程序員不使用流?
偏好,風格,或他們先學會了不同的方法(或不同的語言)。我發現很多舊的「C++」在線例子都是用C語言編寫的,喜歡用printf來表示。
最完整的答案,它提到了有關安全的東西。 – 2010-01-21 19:06:42
當你希望你的應用程序可以移植到不同的平臺。
當你想更簡潔的代碼:Win32函數具有更復雜的語義,往往需要的功能的集合做一些事情,肯定有更多的參數。
流通常是相當安全的。在某些情況下,他們可能會變得緩慢和/或笨拙。主要原因在於它們在代碼和操作系統之間增加了一些額外的層次,在錯誤的情況下,這些層次可能會增加開銷。這種笨拙主要與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往往不會有競爭力。
對於那些不使用它的人來說,通常這篇文章中的「i18n」意味着「國際化」。 「i」和「n」之間有18個字符,因此是「i18n」。 – 2010-01-21 18:13:29
@kevin:哎呀,很對。感謝翻譯。 – 2010-01-21 18:27:26
* printf仍然不能用於i18n,因爲變量的位置和類型是硬編碼的。 – rpg 2010-01-22 10:38:59
我喜歡printf()的原因之一是格式字符串本身可以是資源,因此允許更多外部控制程序輸出而不強制重新編譯。
我喜歡cout()的原因之一是它的原始速度。
根據我的經驗,這往往是一個相當宗教問題。
你不能這樣做異步文件I/O和流...
一個原因是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 & 2是平臺無關。這意味着您可以編譯mac,linux或許多其他操作系統的代碼。選項3僅適用於Windows。這意味着除了Windows之外,您無法編譯它。
當決定選項1 & 2時,取決於您想如何使用它。 C語言庫更易於使用。這是一場噩夢,試圖用流中的替代語言替換文本,但是使流線程安全,將更復雜的類轉換爲可打印格式以及擴展流功能要容易得多。
C++的iostream與C的stdio是一個非常激烈的論點,在這個論壇的許多其他地方討論,如 C++ Streams vs. C-style IO?和其他地方在線。
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
頻繁使用'boost :: format'可能會嚴重損害你的性能。在使用Boost 1.33的項目中,由於性能問題(使用Profiler測量),我不得不停止使用boost :: format。 – 2010-02-26 10:52:18
謝謝,很高興知道。我從來沒有真正嘗試過提升,但看到它如此受歡迎,我應該在某個時候檢查一下。 – 2010-03-01 16:01:43