C++ Vector fwrite 与 fread

来源:互联网 发布:澳洲阳光海岸大学 知乎 编辑:程序博客网 时间:2024/05/21 15:40

关于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元素多了写的文件比较大。

0 0
原创粉丝点击