NCNN-DataReader
路径:src/datareader.h 和 src/datareader.cpp
使用不同的方式读取数据,代码比较简单,都是对库函数的简单封装
源码
class DataReader {
public:
DataReader();
virtual ~DataReader();
// parse plain param text
virtual int scan(const char* format, void* p) const;
// read binary param and model data
virtual size_t read(void* buf, size_t size) const;
// get model data reference
virtual size_t reference(size_t size, const void** buf) const;
};
class DataReaderFromStdio : public DataReader;
class DataReaderFromMemory : public DataReader;
// 对库函数的封装
int DataReaderFromStdio::scan(const char* format, void* p) const {
return fscanf(d->fp, format, p);
}
size_t DataReaderFromStdio::read(void* buf, size_t size) const {
return fread(buf, 1, size, d->fp);
}
int DataReaderFromMemory::scan(const char* format, void* p) const {
size_t fmtlen = strlen(format);
char* format_with_n = new char[fmtlen + 4];
sprintf(format_with_n, "%s%%n", format);
int nconsumed = 0;
int nscan = sscanf((const char*)d->mem, format_with_n, p, &nconsumed);
d->mem += nconsumed;
delete[] format_with_n;
return nconsumed > 0 ? nscan : 0;
}
size_t DataReaderFromMemory::read(void* buf, size_t size) const {
memcpy(buf, d->mem, size);
d->mem += size;
return size;
}
size_t DataReaderFromMemory::reference(size_t size, const void** buf) const {
*buf = d->mem;
d->mem += size;
return size;
}