34 FILE *fp = fopen(filename,
"rb");
36 fseek(fp, 0, SEEK_END);
37 auto size = std::ftell(fp);
38 fseek(fp, 0, SEEK_SET);
40 if (size > 0 && size < LONG_MAX) {
42 data->reserve(size + 1);
44 result =
static_cast<long>(fread(&(*data)[0], 1, size, fp)) == size;
54 FILE *fp = fopen(filename,
"wb");
58 bool result = fwrite(&data[0], 1, data.size(), fp) == data.size();
77 if (size > data_->size() / 4) {
91 return Skip(len * size);
98 }
else if (size > 0) {
108 uint32_t size = data.size();
116 }
else if (size > 0) {
126 uint32_t size = data.size();
129 }
else if (size > 0) {
141 if (!data_is_owned_) {
142 data_ =
new std::vector<char>;
143 data_is_owned_ =
true;
148 if (reader ==
nullptr) {
151 return (*reader)(filename, data_);
157 if (!data_is_owned_) {
158 data_ =
new std::vector<char>;
159 data_is_owned_ =
true;
164 memcpy(&(*data_)[0], data, size);
170 auto current_pos = std::ftell(fp);
171 if (current_pos < 0) {
175 if (end_offset < 0) {
176 if (fseek(fp, 0, SEEK_END)) {
179 end_offset = ftell(fp);
180 if (fseek(fp, current_pos, SEEK_SET)) {
184 size_t size = end_offset - current_pos;
187 if (!data_is_owned_) {
188 data_ =
new std::vector<char>;
189 data_is_owned_ =
true;
192 return fread(&(*data_)[0], 1, size, fp) == size;
198 while (size + 1 < buffer_size && offset_ < data_->size()) {
199 buffer[size++] = (*data_)[offset_++];
200 if ((*data_)[offset_ - 1] ==
'\n') {
204 if (size < buffer_size) {
207 return size > 0 ? buffer :
nullptr;
212 if (swap_ && size != 1) {
213 char *char_buffer =
static_cast<char *
>(buffer);
214 for (
size_t i = 0;
i < num_read; ++
i, char_buffer += size) {
224 size_t required_size;
225 if (SIZE_MAX / size <=
count) {
227 required_size = data_->size() - offset_;
229 required_size = size *
count;
230 if (data_->size() - offset_ < required_size) {
231 required_size = data_->size() - offset_;
234 if (required_size > 0 && buffer !=
nullptr) {
235 memcpy(buffer, &(*data_)[offset_], required_size);
237 offset_ += required_size;
238 return required_size / size;
248 if (data !=
nullptr) {
249 if (data_is_owned_) {
253 data_is_owned_ =
false;
254 }
else if (!data_is_owned_) {
255 data_ =
new std::vector<char>;
256 data_is_owned_ =
true;
265 if (writer ==
nullptr) {
268 return (*writer)(*data_, filename);
276 size_t total = size *
count;
277 const char *buf =
static_cast<const char *
>(buffer);
280 for (
size_t i = 0;
i < total; ++
i) {
281 data_->push_back(buf[
i]);
void ReverseN(void *ptr, int num_bytes)
bool(*)(const std::vector< char > &data, const char *filename) FileWriter
bool SaveDataToFile(const GenericVector< char > &data, const char *filename)
bool(*)(const char *filename, std::vector< char > *data) FileReader
bool LoadDataFromFile(const char *filename, GenericVector< char > *data)
bool DeSerializeSize(int32_t *data)
void OpenWrite(std::vector< char > *data)
size_t FWrite(const void *buffer, size_t size, size_t count)
size_t FReadEndian(void *buffer, size_t size, size_t count)
bool DeSerialize(std::string &data)
bool Serialize(const std::string &data)
size_t FRead(void *buffer, size_t size, size_t count)
char * FGets(char *buffer, int buffer_size)
bool DeSerializeSkip(size_t size=1)
bool Open(const char *filename, FileReader reader)
bool CloseWrite(const char *filename, FileWriter writer)