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(双精度));
但是,在读取数据时,我似乎遇到了运行时错误。你们有什么建议吗?我应该如何尝试使用从其他方法传递的指针来编写一个动态数组,并将其存储在二进制文件中

  • Hy:)
  • *buf,int count);。int write(int-fd,void*buf,int-nbytes)


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

    模板
    结构二进制数据{
    二进制数据(标准::字符串常量和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;
        };