147 using value_type =
typename ContiguousContainer::value_type;
148 using size_type =
typename ContiguousContainer::size_type;
149 detail::ScopedFILE f(filename, access);
150 void * dat = !v->empty() ? &(*v)[0] :
nullptr;
151 size_t vsz =
static_cast<size_t>(v->size());
153 size_t num_elms = fsz /
sizeof(value_type);
154 if(C4_UNLIKELY(fsz != num_elms *
sizeof(value_type)))
155 _RYML_ERR_BASIC(
"{}: file size ({}B) not a multiple of element size ({}B)", filename, fsz,
sizeof(value_type));
156 v->resize(
static_cast<size_type
>(num_elms));
157 if(fsz > vsz *
sizeof(value_type))
195 using I =
typename ContiguousContainer::size_type;
196 using T =
typename ContiguousContainer::value_type;
200 I elmsz =
static_cast<I
>(
sizeof(T));
201 I sz = (num_bytes + elmsz - 1) / elmsz;
202 num_bytes = sz * elmsz;
204 unsigned char *buf =
reinterpret_cast<unsigned char*
>(&(*cont)[0]);
205 while((c = fgetc(f)) != EOF)
209 num_bytes = 2 * num_bytes;
210 if(num_bytes %
sizeof(T))
goto errsize;
211 cont->resize(num_bytes /
sizeof(T));
212 buf =
reinterpret_cast<unsigned char*
>(&(*cont)[0]);
214 buf[pos++] =
static_cast<unsigned char>(c);
218 cont->resize(pos /
sizeof(T));
221 _RYML_ERR_BASIC(
"file size is not multiple of element size");
void file_get_contents(const char *filename, FILE *fp, size_t filesz, void *buf, size_t bufsz)
load a file of specified size from disk into an existing contiguous buffer.
void file_put_contents(void const *buf, size_t sz, FILE *file, const char *filename=nullptr)
save a contiguous buffer into a file
void stdin_get_contents(ContiguousContainer *cont, FILE *f=stdin)
load a file from stdin (or similar stream-like file) and return a newly created ContiguousContainer w...