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<class T>
struct __list_node{
typedef void* void_pointer;
void_pointer prev;
void_pointer next;
T data
}
从这里可以看出,list中用于存储不同类型的值,如int 或者 float 会影响list的节点的大小。
而list本身的结构如下:
template<class T>
class list{
protected:
typedef __list node<T> list_node;
public:
typdefef __list node* link_type;
protected:
link_type node;//只要一个指针,便可表示整个list
...
}
从这里可以看出,
list中仅仅是保存了一个指向其节点的指针,
所以当对list使用sizeof的时候,
只会计算这个指针的占用的空间大小,
和整个list所指向的链表有多少个节点无关。
也就是说sizeof(list<double>)始终都是同一个值。
如果想知道list中存放了多少个值,可以调用list.size();
至于把list中的内容写到文件上,可以循环的读取list中的内容,然后再写至相应的文件
下面是我写的一段代码(VS2005编译器),楼主可以参考一下:
#include<iostream>
#include<fstream>
#include<iostream>
#include<list>
using namespace std;
int main()
{
fstream file("test.txt",fstream::out);
list<int> int_list;
cout<<sizeof(int_list)<<endl;//cout<<24
cout<<int_list.size()<<endl;//cout<<0
for(int i=0;i<100;i++)
int_list.push_back(i);
cout<<sizeof(int_list)<<endl;//cout<<24
cout<<int_list.size()<<endl;//cout<<100
for(list<int>::const_iterator it=int_list.begin();it!=int_list.end();it++)
file<<*it<<endl;//cin to file
file.clear();
file.close();
}才v型不会消防官兵幸福感大方向巴格达韩峰的话地方多过
上一个:C++ 如何判断路径是文件还是目录
下一个:Microsoft Visual C++ 2008是什么程序?