免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3742 | 回复: 9
打印 上一主题 下一主题

一个关于C++语言中ostream_iterator的问题。 [复制链接]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-22 16:51 |只看该作者 |倒序浏览
兄弟写了一个类如下:

class MyVector
{
  private:
    vector <void *> vec; //vec保存往其中添加的节点的指针,所有的节点的类型都是一样的,所以大小也一样.
    int SizeOfOneNode; //这个变量保存一个节点的大小.
    ...
  public:
    MyVector(int NodeNum, int NodeSize):SizeOfOneNode(NodeSize) { vec.reserve(NodeNum); }
    ...
    bool SaveVec(const char *file);
    ...
};

//将vec里各个void *类型的指针所指向Node中的数据保存到file里,其中一个Node的大小为SizeOfOneNode.
bool MyVector::SaveVec(const char *file)
{
        ofstream out(file, ios::out | ios::binary);
        
        copy(vec.begin(), vec.end(), ostream_iterator<void *>(out));
        
        return true;
}



兄弟当前写的这个SaveVec只能把各个Node的指针保存起来,请问如何才能做到把各个指针所指向的数据保存到文件里?谢谢!

[ 本帖最后由 ytsmtipe 于 2009-11-22 16:56 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-11-22 19:28 |只看该作者
请问MyVector如何知道void指针是指向什么数据类型?

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
3 [报告]
发表于 2009-11-22 19:54 |只看该作者
它不需要知道void *指向的数据是什么类型,我在构造函数里指定了一个SizeOfOneNode,SizeOfOneNode里会保存数据的大小。

论坛徽章:
0
4 [报告]
发表于 2009-11-22 20:28 |只看该作者

回复 #3 ytsmtipe 的帖子

如果你保证void指针指向的内容不再有指针的话,那就一个for循环把vector内容写到文件即可
自己简单地定义下格式,比如,先写入SizeOfOneNode(比如,前四字节),还可选地写入节点个数,再写入所有节点内容

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
5 [报告]
发表于 2009-11-22 21:19 |只看该作者
其实我的本意是想把SaveVec实现成可以对vec的每一个节点执行如下操作:
把节点对应的void *指针和SizeOfOneNode组成的pair数据对逐一传给ostream_iterator,由ostream_iterator完成向文件流里写入SizeOfOneNode个bytes数据的任务。

不想自己来写这个for循环。

[ 本帖最后由 ytsmtipe 于 2009-11-22 21:20 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-11-22 22:03 |只看该作者

回复 #5 ytsmtipe 的帖子

你的void指针本身就是无类型的,因此它自己没法支持输出操作,所以你得帮它

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
7 [报告]
发表于 2009-11-22 23:09 |只看该作者
是的,我的想法是把void *类型的ostream重载一下子,并把SizeOfOneNode传到重载函数里,但是不知道如何去写这个重载函数。我想这个重载函数应该类似下面这样子的:

template <class T>
ostream& operator<<(ostream& s, T t)
{
        s.write((char *)t, sizeof(*t));
}


但是我的void *没有类型,且暂时又想不到好的法子把SizeOfOneNode传到重载函数里,苦恼。

[ 本帖最后由 ytsmtipe 于 2009-11-23 07:36 编辑 ]

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
8 [报告]
发表于 2009-11-23 07:40 |只看该作者
自己顶一下!

论坛徽章:
0
9 [报告]
发表于 2009-11-23 09:05 |只看该作者

回复 #7 ytsmtipe 的帖子

不好意思,标准库已经有了void*版本的operator<<,千万别钻到牛角钻里面去了

论坛徽章:
2
程序设计版块每日发帖之星
日期:2016-08-10 06:20:00每日论坛发贴之星
日期:2016-08-10 06:20:00
10 [报告]
发表于 2009-11-23 10:36 |只看该作者
我相信C++对这种情况会有解决办法的,只是我们暂时没有想到而已。只是想把指针和它所指向的数据的大小同时传给ostream而已,比如是否可用bind2nd进行约束一下把这两个参数变成一个参数再传到ostream里等解决方法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP