动态数组指向二进制文件

时间:2010-03-14 08:19:28

标签: 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));

写完后,我尝试通过

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

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

2 个答案:

答案 0 :(得分:3)

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

  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函数中具有相同的语义。

答案 1 :(得分:0)

  1. HY:)
  2. If you use Unix you have some functions:    int read(int fd, void
    
         

    * buf,int count);. int write(int fd,void * buf,int nbytes);。

    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