C++如何格式化读写dat文件
dat文件是一行有5个数据,比如分别是L01F02BEIJING0100,希望能把5个数据分别读到5个相应的数组(本来是想用ifstream.read读到结构体然后再给数...
dat文件是一行有5个数据,比如分别是L01 F02 BEIJING 0 100,希望能把5个数据分别读到5个相应的数组(本来是想用ifstream.read读到结构体然后再给数组赋值,但是会出错),而且为什么用ofstream.write写dat文件会出现乱码,应该怎样解决。谢谢:D
void Ticket::Send()
{
Hold ff;
ff.FlightNum="F05";
ff.LineNum="L04";
ff.Target="Beijing";
ff.Haveorder=0;
ff.Rest=100;
ofstream os("Airline.dat",ios_base::out|ios_base::binary);
os.write(reinterpret_cast<char *>(&ff),sizeof(ff));
os.close();
ifstream is("Airline.dat",ios_base::in|ios_base::binary);
if(is)
{
Hold fe;
is.read(reinterpret_cast<char *>(&fe),sizeof(fe));
cout<<fe.FlightNum<<endl;
}
else
cout<<"error"<<endl;
}
比如这一段,写进dat文件就成了乱码了,应如何写入,如何逐个数据读出?去掉ios_base::binary也没用 展开
void Ticket::Send()
{
Hold ff;
ff.FlightNum="F05";
ff.LineNum="L04";
ff.Target="Beijing";
ff.Haveorder=0;
ff.Rest=100;
ofstream os("Airline.dat",ios_base::out|ios_base::binary);
os.write(reinterpret_cast<char *>(&ff),sizeof(ff));
os.close();
ifstream is("Airline.dat",ios_base::in|ios_base::binary);
if(is)
{
Hold fe;
is.read(reinterpret_cast<char *>(&fe),sizeof(fe));
cout<<fe.FlightNum<<endl;
}
else
cout<<"error"<<endl;
}
比如这一段,写进dat文件就成了乱码了,应如何写入,如何逐个数据读出?去掉ios_base::binary也没用 展开
展开全部
问题很多:
1 不提倡直接将一个结构体以二进制的形式写入到文件,读取时也是一样的。
2 Hold结构不太清楚,如果FlightNum字段是char *类型,写入到文件的是指针的值,即“F05"字符串的首地址; 文件中看起来就是类似乱码的东西,这种数据是没有意义的。
如果FlightNum字段是char数组类型,ff.FlightNum="F05";这种语句就编译不过了。这种情况排除。
3 你应该知道指针之间的字符串赋值应该是调用比如memcpy这类函数实现,而且首先得为目的指针分配堆空间。由于文件内字符串长度位置, 分配空间大小未知,不能保证不会出现缓冲区溢出的问题。
4 常见的写法应该是把所有字段(非字符串字段转成字符串)写入到一块缓冲区内,每个地段之间用 数据内不会出现的某个字符进行分隔,然后把整个缓冲区写入到文件, 如果有n个结构体,则重复n次。比如:
char szBuffer[1024] = {0}; // 大致估计数据最大长度,如果不确定,
// 可以先计算出需要的字节长度,然后new一个堆空间
int iBytes = sprintf(szBuffer, "%s\t%s\t%s\t%d\t%d\r\n"
, ff.FlightNum
, ff.LineNum
, ff.Target
, ff.Haveorder
, ff.Rest);
ofstream os("Airline.dat",ios_base::out|ios_base::binary);
os.write(szBuffer, iBytes);
5 从文件读数据,先读出一行,再按分隔符\t查找每个字段,转换字段格式。赋值到结构体的各个字段变量。
6 最好不要使用scanf获取各个字段的值,这个东西的格式容错性很差。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询