cnpy::NpyArray cnpy::npz_load(std::string fname, std::string varname) { FILE* fp = fopen(fname.c_str(),"rb"); if(!fp) { printf("npz_load: Error! Unable to open file %s!\n",fname.c_str()); abort(); } while(1) { std::vector<char> local_header(30); size_t header_res = fread(&local_header[0],sizeof(char),30,fp); if(header_res != 30) throw std::runtime_error("npz_load: failed fread"); //if we've reached the global header, stop reading if(local_header[2] != 0x03 || local_header[3] != 0x04) break; //read in the variable name uint16_t name_len = *(uint16_t*) &local_header[26]; std::string vname(name_len,' '); size_t vname_res = fread(&vname[0],sizeof(char),name_len,fp); if(vname_res != name_len) throw std::runtime_error("npz_load: failed fread"); vname.erase(vname.end()-4,vname.end()); //erase the lagging .npy //read in the extra field uint16_t extra_field_len = *(uint16_t*) &local_header[28]; fseek(fp,extra_field_len,SEEK_CUR); //skip past the extra field uint16_t compr_method = *reinterpret_cast<uint16_t*>(&local_header[0]+8); uint32_t compr_bytes = *reinterpret_cast<uint32_t*>(&local_header[0]+18); uint32_t uncompr_bytes = *reinterpret_cast<uint32_t*>(&local_header[0]+22); if(vname == varname) { NpyArray array = (compr_method == 0) ? load_the_npy_file(fp) : load_the_npz_array(fp,compr_bytes,uncompr_bytes); fclose(fp); return array; } else { //skip past the data size_t size = *(uint32_t*) &local_header[22]; fseek(fp,size,SEEK_CUR); } } fclose(fp); printf("npz_load: Error! Variable name %s not found in %s!\n",varname.c_str(),fname.c_str()); abort(); }
cnpy::NpyArray cnpy::npz_load(std::string fname, std::string varname) { FILE* fp = fopen(fname.c_str(),"rb"); if(!fp) { Rf_error("npz_load: Error! Unable to open file %s!\n",fname.c_str()); } while(1) { std::vector<char> local_header(30); size_t header_res = fread(&local_header[0],sizeof(char),30,fp); if (header_res != 30) Rf_error("cnpy::npz_load read discprepancy on header"); //if we've reached the global header, stop reading if(local_header[2] != 0x03 || local_header[3] != 0x04) break; //read in the variable name unsigned short name_len = *(unsigned short*) &local_header[26]; std::string vname(name_len,' '); size_t vname_res = fread(&vname[0],sizeof(char),name_len,fp); if (vname_res != name_len) Rf_error("cnpy::npz_load read discprepancy on name_len"); vname.erase(vname.end()-4,vname.end()); //erase the lagging .npy //read in the extra field unsigned short extra_field_len = *(unsigned short*) &local_header[28]; fseek(fp,extra_field_len,SEEK_CUR); //skip past the extra field if(vname == varname) { NpyArray array = load_the_npy_file(fp); fclose(fp); return array; } else { //skip past the data unsigned int size = *(unsigned int*) &local_header[22]; fseek(fp,size,SEEK_CUR); } } fclose(fp); Rf_error("npz_load: Error! Variable name %s not found in %s!\n",varname.c_str(),fname.c_str()); // never reached -- not satisfying -Wall -pedantic cnpy::NpyArray unused; unused.word_size = 0; unused.data = NULL; return unused; }
cnpy::npz_t cnpy::npz_load(std::string fname) { FILE* fp = fopen(fname.c_str(),"rb"); if(!fp) { throw std::runtime_error("npz_load: Error! Unable to open file "+fname+"!"); } cnpy::npz_t arrays; while(1) { std::vector<char> local_header(30); size_t headerres = fread(&local_header[0],sizeof(char),30,fp); if(headerres != 30) throw std::runtime_error("npz_load: failed fread"); //if we've reached the global header, stop reading if(local_header[2] != 0x03 || local_header[3] != 0x04) break; //read in the variable name uint16_t name_len = *(uint16_t*) &local_header[26]; std::string varname(name_len,' '); size_t vname_res = fread(&varname[0],sizeof(char),name_len,fp); if(vname_res != name_len) throw std::runtime_error("npz_load: failed fread"); //erase the lagging .npy varname.erase(varname.end()-4,varname.end()); //read in the extra field uint16_t extra_field_len = *(uint16_t*) &local_header[28]; if(extra_field_len > 0) { std::vector<char> buff(extra_field_len); size_t efield_res = fread(&buff[0],sizeof(char),extra_field_len,fp); if(efield_res != extra_field_len) throw std::runtime_error("npz_load: failed fread"); } uint16_t compr_method = *reinterpret_cast<uint16_t*>(&local_header[0]+8); uint32_t compr_bytes = *reinterpret_cast<uint32_t*>(&local_header[0]+18); uint32_t uncompr_bytes = *reinterpret_cast<uint32_t*>(&local_header[0]+22); if(compr_method == 0) {arrays[varname] = load_the_npy_file(fp);} else {arrays[varname] = load_the_npz_array(fp,compr_bytes,uncompr_bytes);} } fclose(fp); return arrays; }
cnpy::npz_t cnpy::npz_load(std::string fname) { FILE * fp = fopen(fname.c_str(), "rb"); if (!fp) printf("npz_load: Error! Unable to open file %s!\n", fname.c_str()); assert(fp); cnpy::npz_t arrays; while (1) { std::vector<char> local_header(30); size_t headerres = fread(&local_header[0], sizeof(char), 30, fp); if (headerres != 30) throw std::runtime_error("npz_load: failed fread"); // if we've reached the global header, stop reading if (local_header[2] != 0x03 || local_header[3] != 0x04) break; // read in the variable name unsigned short name_len = *(unsigned short *)&local_header[26]; std::string varname(name_len, ' '); size_t vname_res = fread(&varname[0], sizeof(char), name_len, fp); if (vname_res != name_len) throw std::runtime_error("npz_load: failed fread"); // erase the lagging .npy varname.erase(varname.end() - 4, varname.end()); // read in the extra field unsigned short extra_field_len = *(unsigned short *)&local_header[28]; if (extra_field_len > 0) { std::vector<char> buff(extra_field_len); size_t efield_res = fread(&buff[0], sizeof(char), extra_field_len, fp); if (efield_res != extra_field_len) throw std::runtime_error("npz_load: failed fread"); } arrays[varname] = load_the_npy_file(fp); } fclose(fp); return arrays; }