随笔-15  评论-18  文章-9  trackbacks-0

 

    这段时间在写一个工具转换器,主要的目的是为了提高文件的加载速度,把文本文件按照规定的格式把内容转换为二进制数据,为了方便调试也需要把二进制逆转换回文本文件。在代码中主要是使用了sscanf和sprintf两个函数进行数据的转换本打算使用stringstream类来处理但是发现stringstring对float的转换会降低精度,所以放弃了,就选择了sscanf,但是其同样也会,但是其代码接口里是使用sscanf,所以选择了sscanf,和sprintf来作为主要的字符格式化函数。

    从文本中读取到数据并进行二进制转换,使用了一个设计就是派发器。因为每行文本的第一个单词就代表着接下来要处理的数据,所以使用了一个map数据结构std::map<std::string , ProFunc> m_mapMark; 其中ProFunc是函数指针。这样就可以根据第一个单词把这行数据分配到相应的函数中处理了。

    对文件使用的是ifstream 和ofstream 但是由于对着些流的不熟悉,在二进制转换为文本时出现了一个问题调试了非常的久都不知道出现了什么问题,为什么在循环的读取过程中会读不到数据,在中途就终止了呢?检查文本到二进制的转换发现没问题呀,但是为什么呢?查了许久才都不知道什么原因,只能google了发现原来是没有指定打开文件的类型。默认是打开文本文本文件,但是当读取到0x1a是就是eof是文件结束符,所以就不往下读了。

    所以只需要在打开文件时指定其类型如:m_inBinFile.open(szBinFileName, 

std::ios::binary);这样就不会出现问题了。

    还有要注意的就是,如果打开了一个文件后想继续使用这个流来打开其他文件则要对这个流进行清理才行。因为其实状态对象,其操作完后处于非正常状态,可能设置有内部eofbit、failbit等标志,所以要进行对其内部标准的清除。

 

posted on 2010-07-25 11:27 木华 阅读(423) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理