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也没用
展开
 我来答
tjm98
2013-06-19 · TA获得超过319个赞
知道小有建树答主
回答量:249
采纳率:0%
帮助的人:140万
展开全部

问题很多:

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获取各个字段的值,这个东西的格式容错性很差。

ljt20061908
2013-06-19 · TA获得超过1033个赞
知道小有建树答主
回答量:527
采纳率:87%
帮助的人:200万
展开全部
write是以二进制写,你觉得二进制文本编辑器能识别吗?不出乱码才怪。
如果你加入了ios::binary的权限就用write和read去读写,ios::binary就代表你要以二进制的格式读写
如果不加的话例如:ofstream os("Airline.dat");
os<<data
基本数据直接这样就可以了,如果是类的话,得在类中重载<<
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式