gpt4 book ai didi

c++ - 使用 fstream 加载二进制文件

转载 作者:太空狗 更新时间:2023-10-29 21:31:06 24 4
gpt4 key购买 nike

我正在尝试通过以下方式使用 fstream 加载二进制文件:

#include <iostream>
#include <fstream>
#include <iterator>
#include <vector>

using namespace std;

int main()
{
basic_fstream<uint32_t> file( "somefile.dat", ios::in|ios::binary );

vector<uint32_t> buffer;
buffer.assign( istream_iterator<uint32_t, uint32_t>( file ), istream_iterator<uint32_t, uint32_t>() );

cout << buffer.size() << endl;

return 0;
}

但它不起作用。在 Ubuntu 中,它因 std::bad_cast 异常而崩溃。在 MSVC++ 2008 中,它只打印 0。

我知道我可以使用 file.read 来加载文件,但我想使用迭代器和 operator>> 来加载文件的一部分。那可能吗? 为什么上面的代码不起作用?

最佳答案

  1. istream_iterator 想要 basic_istream 作为参数。
  2. 不可能在 basic_istream 类中重载 operator>>
  3. 定义全局operator>>会导致与类成员operator>>的编译时冲突。
  4. 您可以为 uint32_t 类型专门化 basic_istream。但是为了特化,你应该重写 basic_istream 类的所有功能。相反,您可以定义虚拟类 x 并为其专门化 basic_istream,如下面的代码所示:
using namespace std;

struct x {};
namespace std {
template<class traits>
class basic_istream<x, traits> : public basic_ifstream<uint32_t>
{
public:
explicit basic_istream<x, traits>(const wchar_t* _Filename,
ios_base::openmode _Mode,
int _Prot = (int)ios_base::_Openprot) : basic_ifstream<uint32_t>( _Filename, _Mode, _Prot ) {}

basic_istream<x, traits>& operator>>(uint32_t& data)
{
read(&data, 1);
return *this;
}
};
} // namespace std

int main()
{
basic_istream<x> file( "somefile.dat", ios::in|ios::binary );
vector<uint32_t> buffer;
buffer.assign( istream_iterator<uint32_t, x>( file ), istream_iterator<uint32_t, x>() );
cout << buffer.size() << endl;
return 0;
}

关于c++ - 使用 fstream 加载二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1154991/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com