簡體   English   中英

如何使用std :: vector進行文件I / O <bool> ?

[英]How to do file I/O with std::vector<bool>?

我需要實現一個布爾數據容器,該容器將存儲大量變量。 我想我可以只使用char*並實現C樣式的宏訪問器,但我希望將其包裝在std::結構中。 std::bitset<size_t>似乎不切實際,因為它在編譯期間具有固定大小。

這樣就留給我std::vector<bool> ,這是為空間優化的; 它有一個不錯的布爾型訪問器。

  1. 有沒有辦法像直接將指針從fwrite()饋給fwrite()嗎?

  2. 以及如何將文件輸入到這樣的向量中?

  3. 最后,當需要大量文件I / O時,它是否是一個好的數據結構?

  4. 隨機文件訪問( fseek等)呢?

編輯:我決定將std::vector<unsigned int>包裝在具有我的需求所要求的功能的新類中。

  • 有沒有辦法像直接將指針從ffeed()饋給fwrite()一樣?

不,但是您可以使用std::fstream做到這一點

std::ofstream f("output.file");
std::copy(vb.begin(), vb.end(), std::ostream_iterator<bool>(f, " "));
  • 以及如何將文件輸入到這樣的向量中?

使用std::fstream

std::ifstream f("input.file");
std::copy(std::istream_iterator<bool>(f), {}, std::back_inserter(vb));
  • 最后,當需要大量文件I / O時,它是否是一個好的數據結構?

不, vector<bool>很少是用於任何目的的良好數據結構。 參見http://howardhinnant.github.io/onvectorbool.html

  • 隨機文件訪問(fseek等)呢?

那呢

您可以使用std::vector<char> ,將其大小調整為文件大小(或其他大小,例如要處理固定長度的塊),然后可以將其內容傳遞給fread()類的函數。或fwrite()以下列方式:

std::vector<char> fileContents;
fileContents.resize(100);
fread(&fileContents[0], 1, 100, theFileStream);

實際上,這只允許您使用C ++樣式調整大小的char數組。 也許這是一個有用的起點? 關鍵是您可以直接訪問向量后面的內存,因為可以保證它像數組一樣順序地放置。

同樣的概念將工作一個 std::vector<bool> -當我只是要小心 fread荷蘭國際集團到這是從我的頭頂,我不能告訴你有多大( sizeof一個明智的) bool是,作為它取決於平台(例如,如果您在微控制器上工作,則為8位,16位和32位)。

似乎std::vector<bool>可以優化為將每個布爾存儲在單個位中,因此,除非您知道它將起作用,否則絕對不要嘗試直接使用vector<bool>后面的內存!

暫無
暫無

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

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