C++ 指向二进制文件的动态数组指针
我知道这可能是非常基本的,但我一直在尝试在创建动态数组(如C++ 指向二进制文件的动态数组指针,c++,memory,binary,storage,C++,Memory,Binary,Storage,我知道这可能是非常基本的,但我一直在尝试在创建动态数组(如 double* data = new double[size]; 用作保存在二进制文件中的数据源,如 ofstream fs("data.bin",ios:binary"); fs.write(reinterpret_cast<const char *> (data),size*sizeof(double)); 流fs的(“data.bin”,ios:binary”); fs.write(重新解释转换(数据),大小*si
double* data = new double[size];
用作保存在二进制文件中的数据源,如
ofstream fs("data.bin",ios:binary");
fs.write(reinterpret_cast<const char *> (data),size*sizeof(double));
流fs的(“data.bin”,ios:binary”);
fs.write(重新解释转换(数据),大小*sizeof(双精度));
当我写完后,我会尝试把文件通读一遍
double* data = new double[size];
ifstream fs("data.bin",ios:binary");
fs.read(reinterpret_cast<char*> (data),size*sizeof(double));
double*数据=新的double[大小];
ifstream fs(“data.bin”,ios:binary”);
fs.read(重新解释铸件(数据),尺寸*sizeof(双精度));
但是,在读取数据时,我似乎遇到了运行时错误。你们有什么建议吗?我应该如何尝试使用从其他方法传递的指针来编写一个动态数组,并将其存储在二进制文件中
流并不是访问二进制文件的唯一方法,也不总是最好的方法。这是使用操作系统虚拟内存机制的另一种方式(即,与将内存交换到磁盘的方式相同):
模板
结构二进制数据{
二进制数据(标准::字符串常量和fname,无符号大小):\u大小(大小){
int fd=open(fname.c_str(),O_RDWR,O_CREAT);
//如果修改为不同的大小或创建
ftruncate(fd,尺寸*尺寸(T));
//获取内存
_数据=重新解释强制转换(mmap(0,大小*大小(T),保护写入,保护读取,映射共享,fd,0));
fclose(fd);
}
~BinaryData(){
munmap(_数据);
}
T*begin(){return_data;}
T*end(){return\u data+\u size;}
私人:
T*_数据;
未签名的_大小;
};
这只是将内存交换到不同的交换文件,即您指定的文件。当程序退出或调用munmap时,选择的标志将始终强制它将内容写入磁盘。当然,这个示例在错误检查方面没有任何内容,语法只在POSIX系统上有效。但是Windows在其CreateFileMapping函数中具有相同的语义。在阅读之前,您是否使用
is_open()
检查了文件是否已打开?您好,感谢您的快速响应。我确实先检查了文件是否打开了。但它似乎不起作用,我不确定我做错了哪一部分,读写部分。对我来说是有效的。也许您可以将其简化为一个简单的测试用例,并将其发布在这里。以下是我尝试过的:加载链接时遇到一些麻烦,但感谢Firas Assaad。我假设问题可能是我将数组传递给保存数据的方法的方式。双数组的源是对象的私有数据。我使用另一个对象来获取数组,方法是double*getData();它将返回指针。然后我将指针receive传递给saving方法。指针是从源obj->handler obj->save()传递的;这可能是导致问题的关键因素之一吗?std::vector通常可以用来代替普通数组。如果您需要将数组传递给库,这很好:vector vec;cFunctionTakingArray(&vec[0],vec.size());//是C++代码调用C函数的常用模式,它具有数组的大小。谢谢您花费大量的精力和时间来测试我的问题。它现在看起来确实运行得很好,问题是在其他地方导致了持久化方法的错误。再次感谢serbanlupu。感谢您的回复,我以前从未听说过这种方法。我真的大开眼界了,我会调查的。谢谢
If you use Unix you have some functions: int read(int fd, void
The functions are verry fast because
are kernel-functions.
i run your code and everything was
ok :
1 #include <iostream>
2 #include <fstream>
3 #include <cstring>
4 using namespace std;
5
6 int main()
7 {
8 double * s;
9 int ns = 10; //information
10 s = new double[ns];
11
12 for (int i = 0 ; i < ns ; ++i)
13 s[i] = 17*i + 23; // i put my information here
14
15 ofstream os("data.txt", ios::binary);
16 os.write(reinterpret_cast<const char*> (s), sizeof(double) * ns);
17 os.close();
18
19 double * final;
20 final = new double[ns];
21
22 ifstream is("data.txt", ios::binary);
23 is.read(reinterpret_cast<char *>(final), sizeof(double) * ns);
24 is.close();
25
26 for (int i=0; i < ns; ++i)
27 cout<<s[i]<<" "<<final[i]<<"\n";
28
29 return 0;
30 }
~
none@Brusture:~/Desktop$ g++ -o test
test.cpp none@Brusture:~/Desktop$
./test 23 23 40 40 57 57 74 74 91
91 108 108 125 125 142 142 159 159
176 176
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;
};