簡體   English   中英

將文件讀入 std::vector<std::byte>

[英]Read file into std::vector<std::byte>

我正在嘗試將二進制格式的文件讀入std::vector<std::byte>

  std::ifstream fStream(fName, std::ios::binary);

  std::vector<std::byte> file_content((std::istreambuf_iterator<std::byte>(fStream)),
                                        std::istreambuf_iterator<std::byte>());

但我收到此錯誤(在我看來istreambuf_iterator缺少std::byte的重載)

error: no matching function for call to ‘std::istreambuf_iterator<std::byte>::istreambuf_iterator(std::ifstream&)’
     std::vector<std::byte> file_content((std::istreambuf_iterator<std::byte>(fStream)),

我做錯了什么嗎? 如果是的話,最好的方法是什么?

謝謝!

我正在嘗試將二進制格式的文件讀入std::vector<std::byte>

您正在使用std::istream_iterator ,它使用operator>>std::istream讀取,默認情況下執行格式化讀取而不是二進制讀取。 使用std::istream::read()讀取二進制數據。

如果要使用std::istring_iterator讀取字節,則需要定義調用std::istream::read()std::stream::get()的自定義operator>> 但這將是低效的,因為它一次讀取 1 個字節。 最好直接調用read()讀取多個字節的塊。 例如,查詢文件大小,將std::vector預分配到該大小,然后從std::ifstream直接read()到該大小的std::vector中。

更新:我剛剛注意到您使用的是std::istreambuf_iterator而不是std::istream_iterator std::istreambuf_iterator不使用operator>> ,因此它更適合讀取字節。 但是,它仍然一次讀取 1 個字節,所以我所說的使用std::istream::read()讀取多個字節仍然適用。

你應該可以這樣做:

  std::basic_ifstream<std::byte> fStream{fName, std::ios::binary};

  std::vector<std::byte> file_content{ std::istreambuf_iterator<std::byte>(fStream), {} };

不幸的是,在STL 中只實現了字符迭代器,所以

std::istreambuf_iterator<std::byte>

會導致錯誤。 所以用

std::istreambuf_iterator<char>

相反。

暫無
暫無

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

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