[英]copying from a std::istreambuf_iterator<> to a std::vector<>
[英]Getting desired binary data ranges from std::istreambuf_iterator and std::ifstream
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
int main()
{
std::ifstream file("data.bin", std::ios::binary );
if( file.fail() )
{
std::cout << "File does not exist or could not open file";
return 0;
}
std::vector<short> buffer;
std::copy(
std::istreambuf_iterator<char>( file ),
std::istreambuf_iterator<char>(),
std::back_inserter( buffer )
);
return 0;
}
這只給出了char值范圍(-128,128)。
我以為使用istreambuf_iterator<short>
會給我我想要的但是它會引發“無效轉換”錯誤。
我該怎么做才能讀取short
二進制值?
類std::istreambuf_iterator<cT>
遍歷從std::basic_istream<cT, std::char_traits<cT>>
提取的字符std::basic_istream<cT, std::char_traits<cT>>
或者實際上,它的std::basic_streambuf<cT, std::char_traits<cT>>
。 也就是說,給定特定的流類型, std::istreambuf_iterator<cT>
沒有選擇。 另請注意,盡管傳遞給流緩沖區的std::ios_base::binary
操作,IOStream層並不打算對二進制文件進行操作。
如果要提取short
(或者流的字符類型之外的任何其他類型),您需要自己創建一個合適的迭代器,該迭代器將所選的二進制格式考慮在內。 這個迭代器可以用std::istreambuf_iterator<char>
構建,也可以直接訪問std::streambuf
。
這是我推薦的Spirit方法:
#include <fstream>
#include <boost/spirit/include/qi.hpp>
namespace qi = boost::spirit::qi;
int main()
{
std::ifstream file("data.bin", std::ios::binary);
if(!file)
std::cout << "File does not exist or could not open file";
boost::spirit::istream_iterator f(file), l;
std::vector<int16_t> buffer;
bool ok = qi::parse(f, l, *qi::word, buffer);
}
當然,還有qi::dword
, qi::qword
,big-endian / little-endian variatations等:
你可以看看wchar_t
#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>
int main()
{
std::wifstream file("data.bin", std::ios::binary );
if( file.fail() )
{
std::cout << "File does not exist or could not open file";
return 0;
}
std::vector<wchar_t> buffer;
std::copy(
std::istreambuf_iterator<wchar_t>( file ),
std::istreambuf_iterator<wchar_t>(),
std::back_inserter( buffer )
);
}
我不太確定wchar_t的實際大小是否是實現定義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.