当前位置:编程学习 > C/C++ >>

c++ lIst的对象如何保存在文件中?

如下的程序结果是不对的。
请问:
1.list<double>的对象的大小是sizeof(list<double>)吗?
如果list不断push_back新的对象,list<double>的对象大小是不是应该变大啊。
那么sizeof(list<double>)表示什么呢?
如果定义对象list<double> t,并且执行多次t.push_back(1)使t的size()变大,
sizeof(t)还会一直等于sizeof(list<double>)吗?
2.保存list对象到文件中的正确方法是什么?

list<double> t;
list<double>* ptr;
ofstream ofs;
ifstream ifs;
ofs.open("output", ios::binary);
t.push_back(1);
t.push_back(2);
ofs.write((char*)(&t), sizeof(list<double>))
ofs.close()
ifs.open("output", ios::binary);
ifs.read(ptr, sizeof(list<double>));
答案:这个问题得研究一下list的源码,
list本身和list的节点是不同的结构,首先看list的节点结构:
template&lt;class T&gt;
struct __list_node{
typedef void* void_pointer;
void_pointer prev;
void_pointer next;
T data
}
从这里可以看出,list中用于存储不同类型的值,如int 或者 float 会影响list的节点的大小。

而list本身的结构如下:
template&lt;class T&gt;
class list{
protected:
typedef __list node&lt;T&gt; list_node;
public:
typdefef __list node* link_type;

protected:
link_type node;//只要一个指针,便可表示整个list
...
}

从这里可以看出,
list中仅仅是保存了一个指向其节点的指针,

所以当对list使用sizeof的时候,
只会计算这个指针的占用的空间大小,
和整个list所指向的链表有多少个节点无关。
也就是说sizeof(list&lt;double&gt;)始终都是同一个值。



如果想知道list中存放了多少个值,可以调用list.size();



至于把list中的内容写到文件上,可以循环的读取list中的内容,然后再写至相应的文件

下面是我写的一段代码(VS2005编译器),楼主可以参考一下:

#include&lt;iostream&gt;
#include&lt;fstream&gt;
#include&lt;iostream&gt;
#include&lt;list&gt;
using namespace std;

int main()
{
fstream file("test.txt",fstream::out);
list&lt;int&gt; int_list;
cout&lt;&lt;sizeof(int_list)&lt;&lt;endl;//cout&lt;&lt;24
cout&lt;&lt;int_list.size()&lt;&lt;endl;//cout&lt;&lt;0

for(int i=0;i&lt;100;i++)
int_list.push_back(i);

cout&lt;&lt;sizeof(int_list)&lt;&lt;endl;//cout&lt;&lt;24
cout&lt;&lt;int_list.size()&lt;&lt;endl;//cout&lt;&lt;100

for(list&lt;int&gt;::const_iterator it=int_list.begin();it!=int_list.end();it++)
file&lt;&lt;*it&lt;&lt;endl;//cin to file

file.clear();
file.close();
}
才v型不会消防官兵幸福感大方向巴格达韩峰的话地方多过

上一个:C++ 如何判断路径是文件还是目录
下一个:Microsoft Visual C++ 2008是什么程序?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,