gpt4 book ai didi

c++使用包含 vector 的类的随机访问文件

转载 作者:太空宇宙 更新时间:2023-11-04 11:30:02 25 4
gpt4 key购买 nike

我想从包含 vector<int> 的类中创建一些对象我想将该对象保存在一个文件中,并在下次从该文件中读取,但该程序无法在该类的新对象中正确读取类数据。

例如,它可以读取我的 vector 的大小(即 500),但无法读取 vector 单元格的值!有时,当我的文件包含几个或更多对象时,程序将终止并且不打印任何内容。

class my_class {
int counter;
vector<int> v;
public:
my_class():counter(0),v(500,0){}
void fill_vec(int x) {
v.at(counter++)=x;
}

const vector<int> & get_vec () const {
return v;
}

const my_class & operator=(const my_class &inp){
v=inp.v;
counter=inp.counter;
return *this;
}
};


void write_to_file(my_class x) {
fstream opf("/home/rzz/file/my_file.dat", ios::in |ios::out|ios::binary); // my file has been created before - no problem to creat file here
opf.seekp(0,ios::end);
opf.write(reinterpret_cast < char *> (&x),sizeof(my_class));
}

my_class read_from_file(int record_number){
my_class temp;
fstream opf("/home/rzz/file/my_file.dat", ios::in |ios::out|ios::binary);
opf.seekg(record_number*sizeof(my_class), ios::beg);
opf.read(reinterpret_cast< char *> (&temp),sizeof(my_class));
return temp;
}

int main() {
my_class zi;
zi.fill_vec(15);
write_to_file(zi);
my_class zi2=read_from_file(0);
vector<int> vec;
vec=(zi2.get_vec());
cout<<zi2.get_vec().size();// right answer , print 500 correctly
cout<<"first element of vector ( should be 15 ) : "<<vec.at(0);//print 0 here , that is wrong

return 0;
}

谁能帮帮我?

最佳答案

写出一些东西的位图通常不会给你您可以重读的数据;你需要的事实一个 reinterpret_cast 这样做应该警告你你正在很薄的冰。您需要定义文件的格式想要编写或使用现有格式(XDR 或 Google 的 Protocol Buffer ,如果你想要二进制,XDR 更简单实现,至少如果你限制机器的可移植性一个 32 位 2 的补码整数类型和 IEEE float );然后在 char 缓冲区中将数据格式化为它,然后写入那个。

编辑:

因为我被要求举个例子:

为简单起见,我将格式化为缓冲区;通常,我会写一个 oxdrstream 类,并直接格式化为输出流,但这涉及更复杂的错误处理。我也会假设一个 32 位 2 的补码整数类型。这不是保证,并且有些系统不是这种情况,但是他们相当罕见。 (在这里,我使用 uint32_tint32_t 来确保代码不会在不支持的系统上编译支持一下。)

void
insertUInt( std::vector<char>& dest, uint32_t value )
{
dest.push_back( (value >> 24) & 0xFF );
dest.push_back( (value >> 16) & 0xFF );
dest.push_back( (value >> 8) & 0xFF );
dest.push_back( (value ) & 0xFF );
}

void
insertInt( std::vector<char>& dest, int32_t value )
{
return InsertUInt( dest, static_cast<uint32_t>(value) );
}

void
insertIntArray( std::vector<char>& dest, std::vector<int> const& value )
{
assert( value.size() <= std::numeric_limits<uint32_t>::max() );
insertUInt( value.size() );
for ( int i: value ) {
insertInt( dest, i );
}
}

(此代码或多或少假设 int32_t整数。否则,您需要一些额外的边界检查每个 int 值。)

关于c++使用包含 vector 的类的随机访问文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25133367/

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