在struct中,我定义了int,unsigned char,string,double等类型。
开始时,我写入用来流fstream,(“”,ios::out||ios::binary);write方法对于char 及string 来说,可以实现写入,但是当写double时我遇到了问题,最终无法解决,因为write(×char,size_t),我无法将double->char*.
于是,采用了fwrite(&g,8,1,fout);可以实现
下面是代码:
#include<iostream>
#include<fstream>
#include"string"
using namespace std;
template <class T>//用来实现T to string(T代表类型),后边没用到
string ConvertToString(T value) {
std::stringstream ss;
ss<<value;
return ss.str();
}
//enum fac_type{Airport=1,Road};
struct inf{
unsigned char b_l;
unsigned char b_ctry;
unsigned char b_p;
unsigned char b_r;
unsigned char b_s;
unsigned char b_cty;
unsigned char b_ci;
unsigned char b_t;
unsigned char b_su;
unsigned char b_sa;
unsigned char b_o;
unsigned char b_a;
string locid;
int type;
string country;
string postal;
string region;
string state;
string county;
string city;
string town;
string street_num;
string street_nam;
double lon;
double lat;
string offi_name;
string alter_name;
};
void shuchu(inf ginf)
{
cout<<ginf.locid<<","<<ginf.type<<","<<ginf.country<<","<<ginf.postal<<","<<ginf.region<<","<<ginf.state<<","<<ginf.county<<","<<ginf.city<<","<<ginf.town<<","<<ginf.street_num<<","<<ginf.street_nam<<","<<ginf.lon<<","<<ginf.lat<<","<<ginf.offi_name<<endl;
}
void fshuchu(inf ginf,FILE *fout)
{
//string foutname;
//cin>>foutname;
/*fstream fout(foutname.c_str(),ios::out|ios::binary);*/
fwrite(&ginf.b_l,1,1,fout);
fwrite(ginf.locid.c_str(),ginf.locid.length(),1,fout);
fwrite(&ginf.type,1,1,fout);//
fwrite(ginf.country.c_str(),ginf.country.length(),1,fout);
fwrite(&ginf.b_ctry,1,1,fout);
fwrite(ginf.postal.c_str(),ginf.postal.length(),1,fout);
fwrite(&ginf.b_p,1,1,fout);
fwrite(ginf.region.c_str(),ginf.region.length(),1,fout);
fwrite(&ginf.b_r,1,1,fout);
fwrite(ginf.state.c_str(),ginf.state.length(),1,fout);
fwrite(&ginf.b_s,1,1,fout);
fwrite(ginf.county.c_str(),ginf.county.length(),1,fout);
fwrite(&ginf.b_cty,1,1,fout);
fwrite(ginf.city.c_str(),ginf.city.length(),1,fout);
fwrite(&ginf.b_ci,1,1,fout);
fwrite(ginf.town.c_str(),ginf.town.length(),1,fout);
fwrite(&ginf.b_t,1,1,fout);
fwrite(ginf.street_num.c_str(),ginf.street_num.length(),1,fout);
fwrite(&ginf.b_su,1,1,fout);
fwrite(&ginf.lon,8,1,fout);
fwrite(&ginf.lat,8,1,fout);
fwrite(ginf.offi_name.c_str(),ginf.offi_name.length(),1,fout);
fwrite(&ginf.b_o,1,1,fout);
fwrite(ginf.alter_name.c_str(),ginf.alter_name.length(),1,fout);
fwrite(&ginf.b_a,1,1,fout);
//inf *b=&ginf;
//fout.write((char *)b,sizeof(ginf));
}
inf getinf(string s)
{
inf ginf;
string sg[15];
for(int i=0,j=0;i<s.length();i++){
if(s.at(i)!=',')
sg[j]+=s.at(i);
else
j++;
}
ginf.locid=sg[0];
ginf.b_l=(int)sg[0].length()&0xFF;//得到地位数放在char中,因为我用的int<10
ginf.type=1;
ginf.country=sg[2];
ginf.b_ctry=(int)sg[2].length()&0xFF;
ginf.postal=sg[3];
ginf.b_p=(int)sg[3].length()&0xFF;
ginf.region=sg[4];
ginf.b_r=(int)sg[4].length()&0xFF;
ginf.state=sg[5];
ginf.b_s=(int)sg[5].length()&0xFF;
ginf.county=sg[6];
ginf.b_cty=(int)sg[6].length()&0xFF;
ginf.city=sg[7];
ginf.b_ci=(int)sg[7].length()&0xFF;
ginf.town=sg[8];
ginf.b_t=(int)sg[8].length()&0xFF;
ginf.street_num=sg[9];
ginf.b_su=(int)sg[9].length()&0xFF;
ginf.street_nam=sg[10];
ginf.b_sa=(int)sg[10].length()&0xFF;
ginf.lon=atof(sg[11].c_str());
ginf.lat=atof(sg[12].c_str());
ginf.offi_name=sg[13];
ginf.b_o=(int)sg[13].length()&0xFF;
ginf.alter_name=sg[14];
ginf.b_a=(int)sg[14].length()&0xFF;
return ginf;
}
int main()
{
string fname;
cout<<"enter the file1 name";
cin>>fname;
string foutname;
cout<<"enter the file2 name";
cin>>foutname;
ifstream fin(fname.c_str(),ios::in);
if(!fin){cout<<""<<endl;}
string str_g;
FILE *fout;
fout=fopen(foutname.c_str(),"rb++");
while(getline(fin,str_g)){
char ptr;
ptr=str_g.at(0);
if(ptr=='#')
continue;
else if(str_g.substr(0,5)=="Locid")
continue;
inf ginf=getinf(str_g);
shuchu(ginf);
fshuchu(ginf,fout);
}
fin.close();
fclose(fout);
return 0;
}