otl_stream有类似fstream的seekg函数一样的函数吗?如果没有的话如何实现类似功能?假如一个行中有5个元素我只需要读第2,3,5个元素,如何做?难道必须将5个元素读到一个数组中再读取吗?但是我不知道第1,4个元素的数据类型,所以读第1,4个元素时不知道用什么类型的变量作为流操作符>>右边的操作变量,我只知道第2,3,5个元素的数据类型,这该如何处理呢?如果otl_stream实现了类似fstream类的seekg函数的功能,那就好办了,但是不知道有没有??那位高手能指点一下,不胜感激啊!
解决的话给29分,我总共就这么多分,谢谢
otl_column_desc * describe_select(int & desc_len)
哦,明白,用这个函数得到各个列的数据类型,但是otl_stream不能直接超过忽略某些列吗?
@Patrickz10: 不能,你可以通过它提供的基本函数封装一个 seek 操作。
@Launcher: 谢谢,那我看看该如何封装?
@Launcher: 似乎要实现不是很难,至少可行性很高,因为OTL里面也是用数组存储行数据,读取时用cur_col定位读取数组哪个位置,不知道OTL为什么就不顺便实现seekg的功能呢?我想改它的代码,不过毕竟我没有全部读透所有程序,怕影响到其他,而且改了以后若需要更新OTL版本很麻烦,所以还是想通过它提供的基本函数在外部扩展封装一个 seek 操作,你能告诉我它提供了哪些基本函数可以用来实现seekg函数吗?
@Patrickz10: 假设执行 select f1,f2 from t1 返回 10 行,那么你如何读取这 10 行数据的?
@Launcher: 大概是这样吧:
double f1, f2;
try{
otl_stream i(50, sql.c_str(), db);
while (!i.eof()) {
i >> f1;
i >> f2;
}
}
catch (otl_exception &p){
throw p;
}
@Patrickz10: 你把重载的 >> 操作符的源码贴出来看看。
@Launcher: 不好意思,刚出去忙,重载>>代码(假设右边变量是char类型):
OTL_TMPL_SELECT_STREAM &operator>>(char &c) {
check_if_executed();
if (eof_intern())
return *this;
get_next();
if (check_type(otl_var_char) && !eof_intern()) {
c = *OTL_RCAST(char *, sl[cur_col].val(this->cur_row));
look_ahead();
}
return *this;
}
@Patrickz10:数据存储在这里的吧:sl[cur_col].val(this->cur_row)),看能单独增加 cur_col 和 cur_row 的值不?
@Launcher: 谢谢你的提醒,有一个get_next函数可单独递增cur_col的值,看来我增加一点代码就行了!