簡體   English   中英

C ++截斷iostream類

[英]C++ Truncating an iostream Class

對於我正在致力於加載/存儲文件中數據的項目,我決定實現iostream庫,因為它具有其他文件io庫所不具備的某些功能。 這樣的功能之一就是能夠使用派生的fstream或stringstream類來允許從文件或內存中已經存在的位置加載數據。 盡管到目前為止,有一個主要的后備,而且一段時間以來我一直在獲取有關它的信息方面遇到麻煩。

與POSIX庫中可用的功能類似,我正在尋找截斷或ftruncate函數的某些實現。 對於stringstream,這就像將關聯的字符串以不同的大小重構之后將其傳遞回流一樣容易。 實際上,對於fstream,我還沒有找到任何實現此目的的方法,因為我什至沒有找到將此類文件的句柄拉出此類的方法。 給我一個解決fstream問題的方法雖然很棒,但要更好地解決此問題,必須是iostream友好的。 因為在我的程序中,每種流類的每種用法都經過一個iostream,所以通過基類截斷它們會比每次我要更改總體大小時都要弄清楚哪個類在控制流更容易。

另外,如果有人可以將我指向實現我所尋找的所有這些功能並且可以輕松替換iostream的庫,那么這也是一個很好的解決方案。

編輯:為澄清起見,我正在使用的iostream類更可能僅使用stringstream和fstream類。 實際上,只有文件本身需要被截斷到某個點,我只是在尋找一種更簡單的方法來處理此問題,不需要我知道流附加到哪種類型的流緩沖。 正如答案所建議的那樣,我將研究一種在fstream旁邊使用ftruncate的方法,並且只處理這兩種特定情況,因為程序的最終用戶無論如何都不會看到流類。

您無法在適當位置截斷iostream 您必須將現有流的前N個字節復制到一個新的字節中。 這可以通過基礎streambuf對象的sgetn()sputn()方法完成,您可以通過iostream::rdbuf()獲得這些對象。

但是,該過程可能需要大量I / O。 如前所述,最好使用特殊情況來操縱std::string或調用ftruncate

如果您想真正具有攻擊性,則可以創建一個自定義std::streambuf派生類,該類保留指向流中先前存在的rdbuf對象的指針,並且僅在生成人工文件末尾之前讀取特定點。 對用戶來說,這看起來像一個較短的I / O序列,但實際上不會釋放內存或文件系統空間。 (尚不清楚這對您是否重要。)

暫無
暫無

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

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