关于fwrite 与 fread 的用法就不多说了。网上一大堆。这里说写vector,遇到的问题
写入一个结构体,一个类,还是比较方便的。 这里就不说了
写入vector,
string ip = CW2A(m_strIP.GetBuffer());
string user = CW2A(m_strUser.GetBuffer());
string pass = CW2A(m_strPass.GetBuffer());
vec.push_back(MYDEVICE( ip,m_iport,user,pass));
for(int i = 0;i < vec.size(); ++i)
{
TRACE(_T("Device: %s:%d %s,%s"),CA2W(vec[i].ip.c_str()),vec[i].port,CA2W(vec[i].user.c_str()),CA2W(vec[i].pass.c_str()));
}
f = fopen(DEVICE_PATH,"w");
if(f)
{
fwrite(&vec[0],sizeof(MYDEVICE)*vec.size(),1,f); /vector的首地址,与总大小
fclose(f);
}
就是读取这里不知道怎么读,百度很久也没找到相关的。 我就只能用结构体来读取了,还是读取成功了。
FILE *f = fopen(DEVICE_PATH,"rb");
if(f)
{
fseek(f,0,SEEK_END);
long len = ftell(f);
fseek(f,0,SEEK_SET);
int num = len/sizeof(MYDEVICE);
MYDEVICE *device = (MYDEVICE*)malloc(sizeof(MYDEVICE)*num);
fread(device,sizeof(MYDEVICE),num,f);
fclose(f);
m_listDevice.DeleteAllItems();
CString str;
for(int i = 0; i < num; ++i)
{
int nItem = m_listDevice.InsertItem(m_listDevice.GetItemCount(),_T(""));
m_listDevice.SetItemText(nItem,0,CA2W(device[i].ip.c_str()));
str.Format(_T("%d"),device[i].port);
m_listDevice.SetItemText(nItem,1,str);
}
free(device);
return num;
}
感觉这样麻烦了点,不知道有没有其他方法,记录在这里,后面在找找。 这样就是先获取大小,分配内存,读取出来。有点麻烦。
暂时先这样写了。
。。。。。。。。。。
时隔这么久之后,偶然又遇到这问题,终于懂了怎么一次性读写vector。
写vector.
FILE *fp = fopen( "1.dat", "wb" );
if( fp )
{
fwrite( &m_map[0], m_map.size() * sizeof( int ), 1, fp );
fclose( fp );
fp = 0;
}
读vector
FILE *fvec = fopen( "1.dat", "rb" );
if( fvec )
{
fseek( fvec, 0, 2 );
m_map.resize( ftell( fvec ) / sizeof(int) );
fseek( fvec, 0, 0 );
fread( &m_map[0], m_map.size() * sizeof( int ), 1, fvec );
fclose ( fvec );
fvec = 0;
}
也要先读取文件大小,算出vector元素个数,重设vector的容量。 然后一次性读取出。
这个有个问题,就是当vector元素多了写的文件比较大。