簡體   English   中英

C++ ifstream::read() 和 C arrays

[英]C++ ifstream::read() and C arrays

It seems to be a general consensus that C arrays are bad and that using the smarter alternatives, like vectors or C++ strings is the way to go. 這里沒問題。

話雖如此,為什么ifstreamread()成員將數據輸入到char* ...問題是:我可以單獨使用 STL 以某種方式輸入字節向量嗎?

A related bonus question: do you often check for ios::badbit and ios::failbit especially if you work with a dynamically allocated C string within that scope? 您是否在catch()中釋放 C 字符串?

感謝您的閱讀。

您可以直接讀入分配的向量(我無法從這里編譯它,因此可能存在拼寫錯誤或轉置參數等......)但這個想法是正確的。

vector<char> data;
data.resize(100);

// Read 100 characters into the storage of data
thing.read(&data[0], 100);

話雖如此,為什么 ifstream 的 read() 成員將數據輸入到 char*...

這是一個設計選擇。 不一定是最聰明的。

問題是:我可以以某種方式輸入字節向量嗎

std::vector<char>的底層存儲保證是連續的(即,單個內存塊),所以是的。 要使用ifstream::read ,您必須 (a) 確保向量的大小足夠大(使用.resize() -而不是.reserve() !這是因為向量無法知道您正在讀取的數據到其未使用的capacity並更新其size ),然后(b)獲得指向向量開始元素的指針(例如,使用&v.front()&(v[0]) )。

如果您不想預先設置向量的大小,那么您可以使用更高級的技術,包括迭代器類型和標准庫算法。 它們的優點是您可以輕松地將整個文件讀入向量,而無需先檢查文件長度(並且檢查文件長度的標准技巧可能不像您想象的那么可靠。)。

它看起來像:

#include <iterator>
#include <algorithm> // in addition to what you already have.
// ...
std::ifstream ifs;
std::vector v;
// ...
std::istreambuf_iterator<char> begin(ifs), end;
std::copy(begin, end, std::back_inserter(v));

當然,字節向量不是字符串 但是你可以用std::string做同樣的事情 - std::back_inserter function 足夠聰明,可以為任何提供的提供.push_back()的類型創建適當的迭代器類型, stringvector都可以。 這就是模板的魔力。 :)

單獨使用 STL?

我很困惑。 我以為我們在談論 C++ 標准庫。 你說的這個 STL 是什么?

一個相關的額外問題:你經常檢查 ios::badbit 和 ios::failbit

不; 我通常以可以直接檢查讀取操作結果的方式編寫代碼。 有關示例/討論,請參見http://www.parashift.com/c++-faq-lite/input-output.html#faq-15.4

特別是如果您在 scope 中使用動態分配的 C 字符串?

一般來說,這是一個壞主意。

您是否在 catch() 中釋放了 C 字符串?

不得不處理這類事情是主要原因之一。 這並不容易做到正確。 但我希望你意識到捕捉異常和檢查 ios::bits 是完全不同的兩件事。 雖然您可以配置 stream object 以引發異常,而不僅僅是設置標志位:)

暫無
暫無

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

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