istream_iterator读取二进制文件的问题,请熟悉STL的DX们帮忙

marmoset 2002-01-26 11:45:03
我试图使用istream_iterator读取一个二进制文件(以short为单位):
ifstream infile("binaryfile");
vector<short> vec_test;
istream_iterator ins(infile), eos;
copy(ins, eos, inserter(vec_test, vec_test.begin()));
但是发现数据并没有读到vector里面:(infile肯定是打开了,但vector.size()==0)

当我把ins连到cin上(ins(cin)),也就是从屏幕输出数字时,
是可以把内容读到vector里面去的。

比较两种输入方式,我觉得主要差别有两点:一是屏幕输入每个数字的后面都要有一个回车(换行)符号;二是屏幕输入要以一个非数字字符作为结束标志。而这两样在二进制文件里似乎都不存在。
我现在不清楚这种差异是由于cin导致的还是由于istream_iterator的输出方式要求必须在每个读写单位之间存在特定类型的Manipulator?

请教各位如何解决这个问题?
如果不能的话,用输入输出流如何方便简洁的读取二进制文件,而不必采用文件指针的笨拙办法?
...全文
419 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
qqchen79 2002-01-29
  • 打赏
  • 举报
回复
先用seekg到文件尾,然后tellg当前位置,可得文件长度。
kingkingxy 2002-01-28
  • 打赏
  • 举报
回复
关注!
marmoset 2002-01-28
  • 打赏
  • 举报
回复
up
marmoset 2002-01-27
  • 打赏
  • 举报
回复
to qqchen79
请教一个比较菜的问题,有什么现成的函数能知道一个文件的大小吗?好像fstream没有size()之类的东东。否则我如何一次性的为vector分配内存空间呢?
qqchen79 2002-01-27
  • 打赏
  • 举报
回复
stream_iterator的内部格式华机制只能对文本模式起作用,其实binary格式根本就用不着格式化——说到底是一块内存而已。所以也就用不着stream_iterator:
先用vector的resize方法申请足够的内存,然后直接用一次read把文件内容读到&vec_test[0]就成了。
shornmao 2002-01-27
  • 打赏
  • 举报
回复
to: marmoset() 
有信心的话,可以自己封装一个binary iterator。:P
Kreutzer 2002-01-26
  • 打赏
  • 举报
回复
同意楼上的意见,C++的几乎整个stream都是为text文件实现的,二进制文件还是用C Library吧(fopen / fread)
招RD和QA 2002-01-26
  • 打赏
  • 举报
回复
fstream 是专门为文本文件实现的。
renli21 2002-01-26
  • 打赏
  • 举报
回复
Think in C++
The C++ Programming Language
Effective C++
More Effective C++
^^^^^^^^^^^^^^^^^^

书籍仍在增加,
注册用户可长期免费下载。

http://pat.chinaccd.net/cpp
marmoset 2002-01-26
  • 打赏
  • 举报
回复
to Viper & Kreutzer
fstream并不是专门为文本文件实现的,只不过用fstream打开文件的缺省方式是文本文件。
如果打开二进制文件则:fstream infile("filename", ios::binary)即可。
但是采用上面的方式仍旧不能解决我的问题。
to shornmao
当然,使用read方法完全可以实现我的需求只不过不如用istream_iter看上去那么漂亮:)
short value;
while(infile.good())
{
infile.read((char*)&value, sizeof(short));
testvec.push_back(value);
}
shornmao 2002-01-26
  • 打赏
  • 举报
回复
二进制文件用get/put和read和write,不过iterator不能用了。
为了读取空白,用noskipws。

15,446

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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