怎么 用 fstream 读取二进制格式文件的一行?

truement 2007-04-29 06:38:34
怎么 用 fstream 读取二进制格式文件的一行?一行代表一个类,其中有各个数据成员。
请问我的这种存储方式合理吗?二进制格式文件,一行一个类,如果某行有错误,丢弃,再读下一行,也就是下一个类的数据。这样可以清楚边界问题。
...全文
578 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
jixingzhong 2007-04-30
  • 打赏
  • 举报
回复
是的,
所以,前提就是你的文件和你定义的缓冲(这里是对象)是大小一致的。
truement 2007-04-30
  • 打赏
  • 举报
回复
两位高手,谢谢回答。while(!infile.eof())
{
rectangle rtemp;
infile.read((char*)&rtemp,sizeof(rtemp));
if(infile.fail())
break;
//do something.....
}
这样,如果因为一个类(确切的说是对象)的数据没有写完整,岂不剩余的数据,都废了?也就是破坏了边界?
roger_77 2007-04-29
  • 打赏
  • 举报
回复
要把类或结构体的实例内容写入文件中,最好成员变量都是基本的数据类型,不要有指针类型,否则需要做序列化的工作了.

其实二进制文件,一般就以数据的长度来写入和读取,不需要关心是否换行的问题.

struct rectangle
{
int height;
int width;
};

rectangle rr;
//把结构体数据写入文件中
for(int i =0 ;i<10;++i)
{
rr.height = 10+i;
rr.width = 10+i;
outfile.write((char*)&rr,sizeof(rr));
}
//读取文件中的结构体数据
while(!infile.eof())
{
rectangle rtemp;
infile.read((char*)&rtemp,sizeof(rtemp));
if(infile.fail())
break;
//do something.....
}

////////////////////////////////////////////////////////////
网络发送就是发送一段内存数据,其实跟把数据写入文件中差不多
char szSendBuff[1400];
memset(szSendBuff,0,sizeof(szSendBuff));
//先把要发送的数据COPY到发送缓冲块中,
memcpy(szSendBuff,&rr,sizeof(rr));

然后把发送缓冲块的地址和有效数据长度,给socket的send()即可.






jixingzhong 2007-04-29
  • 打赏
  • 举报
回复
所以,在你的情况下:

input_file.read( (char *)(&classbuffer), sizeof(class) ); //读取一个类的数据
jixingzhong 2007-04-29
  • 打赏
  • 举报
回复
read
Syntax:

#include <fstream>
istream& read( char* buffer, streamsize num );

The function read() is used with input streams, and reads num bytes from the stream before placing them in buffer. If EOF is encountered, read() stops, leaving however many bytes it put into buffer as they are.

For example:

struct {
int height;
int width;
} rectangle;

input_file.read( (char *)(&rectangle), sizeof(rectangle) );
if( input_file.bad() ) {
cerr << "Error reading data" << endl;
exit( 0 );
}
truement 2007-04-29
  • 打赏
  • 举报
回复
另外,fstream 可以将图像文件以二进制格式读进内存吗?通过网络怎么传输?

64,282

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧