динамический массив указатель на двоичный файл - PullRequest
2 голосов
/ 14 марта 2010

Знаю, что это может быть довольно просто, но я пытался выяснить, как это сделать после создания динамического массива, такого как

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 ]

3 голосов
/ 14 марта 2010

Потоки - не единственный и не всегда лучший способ доступа к двоичным файлам. Это еще один способ, который использует механизмы виртуальной памяти операционной системы (то есть то же самое, что делает вашу память подкачкой на диск):

  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.

0 голосов
/ 14 марта 2010
  1. Hy:)
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...