gpt4 book ai didi

c++ - 指向二进制文件的动态数组指针

转载 作者:搜寻专家 更新时间:2023-10-31 02:00:04 33 4
gpt4 key购买 nike

知道这可能是相当基础的,但我一直在尝试弄清楚如何在创建一个动态数组之后使用

double* data = new double[size];

用作保存在二进制文件中的数据源,例如

ofstream fs("data.bin",ios:binary");
fs.write(reinterpret_cast<const char *> (data),size*sizeof(double));

当我完成写入时,我尝试通过读取文件

double* data = new double[size];
ifstream fs("data.bin",ios:binary");
fs.read(reinterpret_cast<char*> (data),size*sizeof(double));

但是我在读取数据时似乎遇到了运行时错误。你们有什么建议我应该如何尝试使用从其他方法传递的指针编写动态数组以存储在二进制文件中?

最佳答案

流不是访问二进制文件的唯一方式,也不总是最好的方式。这是使用操作系统的虚拟内存机制的另一种方式(即让您的内存交换到磁盘的相同方式):

  template<class T>
struct BinaryData{
BinaryData(std::string const& fname,unsigned size):_size(size) {
int fd=open(fname.c_str(),O_RDWR,O_CREAT);
//if modifying to different size or creating
ftruncate(fd,size*sizeof(T));
//get the memory
_data=reinterpret_cast<T*>(mmap(0,size*sizeof(T),PROT_WRITE|PROT_READ,MAP_SHARED,fd,0));
fclose(fd);
}

~BinaryData(){
munmap(_data);
}
T* begin(){return _data; }
T* end(){return _data+_size; }
private:
T* _data;
unsigned _size;
};

这只是将内存交换到不同的交换文件,即您指定的交换文件。选择的标志将始终强制它将内容写入磁盘,无论是在程序退出时还是在调用 munmap 时。这个例子当然没有任何错误检查方面的内容,语法只适用于 POSIX 系统。然而,Windows 在其 CreateFileMapping 函数中具有相同的语义。

关于c++ - 指向二进制文件的动态数组指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2441585/

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