簡體   English   中英

通過FILE *處理流

[英]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慢,並且進行的測試表明, coutprintf慢。

因此,如果速度至關重要,或者它是混合的c ++和c代碼庫,則可能是選擇cstdio庫的一個參數。 否則,c ++的標准io是iostream

在c ++中,您通常更喜歡對流進行操作。 將文件切換到網絡流(或任何其他類型的流)時,使工作變得更輕松。

如前所述,cstdio是c兼容的主要工具,也是直接訪問的途徑,並且仍然經常在人們不喜歡流開銷的代碼中找到。

暫無
暫無

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

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