数据结构的数据保存到文件中。。。

 刚给一个网友回这个问题,好吧,再贴一次。    

如果你用vector动态数组变量保存数据,请在写入文件的时候同时写入它的数组大小。由于vector中保存的是固定大小的结构体,因此读取数据就很简单了。不过写入数据这样是错误的:      

outfile.wrITe(reintERPret_cast<char   *>(&wt),sizeof   wt);    

应该这样    

 for(int   i=0;i<wt.size();i++)      

   outfile.wrITe((char*)&wt[i],sizeof(Widx));    

给你完整代码:                

int   main()    

{    

 Widx   idx   =   {1,"abc"};    

  add_Widx(idx);    

  Widx   idx1   =   {3,"def"};    

   add_Widx(idx1);    

   //写入文件    

   ofstream   outfile("test.dat",ios_bASE::binary);    

   int   iS=wt.size();     //写入数组大小    

   outfile.wrITe((char*)&iS,sizeof(int));     //写入数据    

   for(int   i=0;i<wt.size();i++)      

      outfile.wrITe((char*)&wt[i],sizeof(Widx));    

   for(int   i   =   0;   i   <   wt.size();i++)   //输出结构体    

      cout<<"wt:"<<wt[i].index<<"   "<<wt[i].offset<<endl;         //读出文件    

       int   iS2=0;//数组大小    

      ifstream   infile("test.dat",ios_bASE::binary);    

     infile.read((char*)&iS2,sizeof(int));//读取数组大小    

      //根据文件中的的数组大小,分配数组存储空间    

      std::vector<Widx>   array(iS2);    

     //读取数据    

      for(int   i=0;i<iS2;i++)      

        infile.read((char*)&array[i],sizeof(Widx));    

      //ok,验证        

      system("pause");     return   0;    

}     

也可以固定大小,但当文件要保存的数据量较大时,最好不要用流,运行时库函数是个不错的选择。        

 #include   "stdafx.h"    

#include   <iostream>    

#include   <list>    

 #include   <sys/types.h>    

#include   <sys/stat.h>    

#include   "io.h"    

 #include   "fcntl.h"    

#include   "tchar.h"    

using   namespace   std;        

#define   FIELD_LENGTH 1024    

typedef   struct   {     int nIndex;     TCHAR offset[FIELD_LENGTH];     }   Widx;        

list<Widx>   wt;    

void   add_Widx(Widx   _wt)   {wt.push_back(_wt);   }        

 int   GetFileSizeFromFileName(char   *lpszFilename)    

{    

struct   _stat   stFileStat;    

memset(&stFileStat,   0,   sizeof(struct   _stat));    

_stat(lpszFilename,   &stFileStat);     return   stFileStat.st_size;     }        

 int   main()    

{    

Widx   idx   =   {0};        

idx.nIndex   =   1;    

 _tcsncpy(idx.offset,   "abc",   sizeof(idx.offset)   /   sizeof(TCHAR)   -   1);    

 add_Widx(idx);        

idx.nIndex   =   3;    

 _tcsncpy(idx.offset,   "def",   sizeof(idx.offset)   /   sizeof(TCHAR)   -   1);    

 add_Widx(idx);        

 //写入文件    

int   nFD   =   _open("test.dat",   _O_WRONLY   |   _O_CREAT,   _S_IWRITE);    

if   (nFD   ==   -1)     {     return   -1;     }        

 list<Widx>::iterator   IT   =   wt.begin();    

for(   ;   it   !=   wt.end();   ++IT)    

{    

_write(nFD,   (char   *)(&(*IT)),   sizeof(Widx));    

cout   <<   "wt:"   <<   (*it).nIndex   <<   "   "   <<   (*IT).offset   <<   endl;    

}    

_close(nFD);        

 wt.clear();        

 //读出文件    

 if   ((nFD   =   _open("test.dat",   _O_RDONLY   |   _O_CREAT,   _S_IREAD))   ==   -1)     {     return   -1;     }        

for   (int   i   =   0;   i   <   GetFileSizeFromFileName("test.dat")   /   sizeof(Widx);   i++)    

{    

_read(nFD,   &idx,   sizeof(Widx));    

cout   <<   "wt"   <<   i   <<   ":"   <<   idx.nIndex   <<   "   "   <<   idx.offset   <<   endl;        

}    

 _close(nFD);        

 system("pause");    

return   0;     }     

 要么把相关的长度数据保存到文件中,相当于定义了自己的文件格式。     要么使用固定的长度。         二选一,各有利弊。

 

欢迎转载,但请保留出处,本文章转自[华软网] 原文链接:http://www.huarw.com/program/bbs/cbbs/200510/1532497.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值