[英]manipulating a stream via FILE*
我剛剛遇到了一些使用FILE *來使用“ f”函數(fopen,fseek,fread等)操縱文件流的C ++代碼。 我相信這些是由標准頭文件cstdio提供的。
在現代C ++代碼中,這被認為是過時的還是不良的做法? 我問,是因為我也看到您可以使用setg和tellg獲取/設置ifstream對象的流的位置,我想知道這樣做的好處。 這是操縱流的“老習慣”嗎,還是在現代C ++代碼中使用FILE *和“ f”函數的正當理由?
它們在那里具有C兼容性,盡管沒有什么阻止您在現代C ++程序中使用它們。
有些人傾向於使用C流,因為他們不喜歡C ++流(在許多方面可以說是一團糟),或者他們認為C流更快。 最后一點在幾年前的許多實現中都是有效的,但是在現代實現中,C ++流通常往往更快一些(此聲明基於我在g ++,YMMV上所做的一些基准測試)。
盡管如此,C流仍然存在一個重要的問題:由於它們是C東西,並且沒有按類實現,因此在將它們與異常一起使用時必須格外小心,否則可能會泄漏文件句柄。 此問題與C ++文件流無關,因為它們封裝在類中,當異常導致堆棧展開時將調用其析構函數,因此可以防止文件句柄泄漏。
AFAIK,在C ++中,正確的方法是使用ifstream 。 顧名思義, cstdio僅用於C兼容性。
兩者都是正確的。
對於C ++,大多數情況下應使用iostream庫。
iostream庫以通用方式輸出和輸出,並提供類型安全性,並且比cstdio少出錯。 iostream庫還提供了可擴展性,允許您繼承和重載以使您自己的類型(除標准類型外)都可流式傳輸。
但是,有些人認為iostream庫過於冗長,還有一些人使用cstdio庫,因為他們最熟悉它。
存在一些使用cstdio的有效點。 大多數iostream實現在性能上都比cstdio慢,並且進行的測試表明, cout
比printf
慢。
因此,如果速度至關重要,或者它是混合的c ++和c代碼庫,則可能是選擇cstdio庫的一個參數。 否則,c ++的標准io是iostream
在c ++中,您通常更喜歡對流進行操作。 將文件切換到網絡流(或任何其他類型的流)時,使工作變得更輕松。
如前所述,cstdio是c兼容的主要工具,也是直接訪問的途徑,並且仍然經常在人們不喜歡流開銷的代碼中找到。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.