X-Git-Url: http://git.nguyen.vg/gitweb/?a=blobdiff_plain;f=BlockArray.h;h=99aff9130e3e135369d9934cd6bae3c4fd02c975;hb=9df50e6e5e58f746e83b9ad1d539024f82fa8b64;hp=cc60c3558dedb8b8333b47807e3a5f9f6111b1e5;hpb=33f321f97182b61a044e8508c2014ad7ce2bdec6;p=SXSI%2FTextCollection.git diff --git a/BlockArray.h b/BlockArray.h index cc60c35..99aff91 100644 --- a/BlockArray.h +++ b/BlockArray.h @@ -1,7 +1,8 @@ #ifndef _BLOCK_ARRAY_H_ #define _BLOCK_ARRAY_H_ -#include #include "Tools.h" +#include +#include class BlockArray { @@ -43,7 +44,44 @@ public: ulong spaceInBits() { return n*blockLength+W; // plus 4 ulong's } + + /** + * Saving data fields: + * ulong n; + * ulong blockLength; + * ulong* data; + */ + void Save(FILE *file) const + { + if (std::fwrite(&(this->n), sizeof(ulong), 1, file) != 1) + throw std::runtime_error("BlockArray::Save(): file write error (n)."); + if (std::fwrite(&(this->blockLength), sizeof(ulong), 1, file) != 1) + throw std::runtime_error("BlockArray::Save(): file write error (blockLength)."); + for (ulong offset = 0; offset < n*blockLength/W+1; offset ++) + { + if (std::fwrite(this->data + offset, sizeof(ulong), 1, file) != 1) + throw std::runtime_error("BlockArray::Save(): file write error (data)."); + } + } + + /** + * Load from file + */ + BlockArray(FILE *file) + { + if (std::fread(&(this->n), sizeof(ulong), 1, file) != 1) + throw std::runtime_error("BlockArray::Load(): file read error (n)."); + if (std::fread(&(this->blockLength), sizeof(ulong), 1, file) != 1) + throw std::runtime_error("BlockArray::Load(): file read error (blockLength)."); + + data = new ulong[n*blockLength/W+1]; + for (ulong offset = 0; offset < n*blockLength/W+1; offset ++) + { + if (std::fread(this->data + offset, sizeof(ulong), 1, file) != 1) + throw std::runtime_error("BlockArray::Load(): file read error (data)."); + } + } }; #endif