/** * Text mode STL reader. * * The reader should be ablet to read some information even when the fil is * truncated or otherwise broken without crashing. * * \returns no error code, it fails silently, but creates an intact (possibly incomplete) dataset */ int ETModelTextSTL::Load() { NTri = 2048; tri = (ETTriangle*)calloc(NTri, sizeof(ETTriangle)); char buf[1024]; // read "solid name" (we already verified that); for (;;) { if (FEof()) break; FGetS(buf, 1023); char *src = buf; if (Find(src, "solid")) break; } for (;;) { char *src = buf; for (;;) { if (FEof()) break; buf[0] = 0; FGetS(buf, 1023); src = buf; // read "facet normal ni nj nk" if (Find(src, "facet normal")) break; } if (NTri==nTri) { NTri += 2048; tri = (ETTriangle*)realloc(tri, NTri*sizeof(ETTriangle)); } ETTriangle &t = tri[nTri]; if (sscanf(src, "%f %f %f", &t.n.x, &t.n.y, &t.n.z)!=3) break; if (!t.n.isFinite()) continue; // read "outer loop" FGetS(buf, 1023); src = buf; if (!Find(src, "outer loop")) break; // read "vertex x y z" FGetS(buf, 1023); src = buf; if (!Find(src, "vertex")) break; if (sscanf(src, "%f %f %f", &t.p0.x, &t.p0.y, &t.p0.z)!=3) break; if (!t.p0.isFinite()) continue; // read "vertex x y z" FGetS(buf, 1023); src = buf; if (!Find(src, "vertex")) break; if (sscanf(src, "%f %f %f", &t.p1.x, &t.p1.y, &t.p1.z)!=3) break; if (!t.p1.isFinite()) continue; // read "vertex x y z" FGetS(buf, 1023); src = buf; if (!Find(src, "vertex")) break; if (sscanf(src, "%f %f %f", &t.p2.x, &t.p2.y, &t.p2.z)!=3) break; if (!t.p2.isFinite()) continue; // read "outer loop" FGetS(buf, 1023); src = buf; if (!Find(src, "endloop")) break; // read "outer loop" FGetS(buf, 1023); src = buf; if (!Find(src, "endfacet")) break; // don't increment the counter until we are sure that the triangle is read. nTri++; } return 1; }
int ConfigFile::_ReadEntry(const char *entry, char *buf, int bufSize,bool strip ) { /* 功能:读取entry的值 参数: entry[IN]:entry名称 buf[IN]:存放entry的值的缓冲区 bufSize[IN]:缓冲区长度 strip[IN]:去除空格标志 返回值: 成功返回读取的长度 失败返回-1 */ char lineBuf[1024]; //memset(lineBuf,0,1024); char *p, *cur; int len; cur = buf; *cur = '\0'; len = -1; while(FGetS(lineBuf,1023,fin)) { if( isTitleLine( lineBuf ) ) // section fis ended break; p = textPos( lineBuf, entry ); // not equal this entry if( p == 0 ) continue; if( strip ) stripQuotationChar( p ); len = strlen(p); if( bufSize-1 < len ) len = bufSize-1; strncpy( cur, p, len ); cur[len] = 0; break; } return len; }
bool ConfigFile::gotoSection(const char *section ) { /* 功能:移动文件指针到指定section的开始处 参数: section[IN]:要查找的section 返回值: 找到并定位返回true 否则返回false */ char line[1024]; fseek(fin,0,SEEK_SET); while( FGetS(line,1024,fin)!=NULL) { if( containTitle( line, section ) ) return true; } return false; }