关于使用fstream读取2进制文件的问题!

Linux2001 2006-02-15 02:09:09
我使用fstream读取2进制文件,发现当文件中包含了0x1A字符的时候,fstream将无法继续读取了,代码如下:
#include <fstream>
#include <string>
#include <iostream>

using namespace std;

int main()
{
fstream f("C:\\a.stg");

if (f.is_open())
{
f.seekg(0L, ios::end);
int len = f.tellp();

char c;
f.seekg(0L, ios::beg);

for(int i = 0; i < len; i++)
{
f.read(&c, 1);
printf("%X", c);
}
}
return 0;
}

a.stg文件的字节大概是这样排列的,你只需要新建一个这个文件,把这些字节填充进去,就可以发现问题了!还有就是,哪里有详细讲解如何使用fstream的文章或者书籍?谢谢!
D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3E 00 03 00 FE FF 09 00
...全文
337 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mjm_d 2006-05-01
  • 打赏
  • 举报
回复
http://community.csdn.net/Expert/topic/4718/4718793.xml?temp=.6876337
Linux2001 2006-02-16
  • 打赏
  • 举报
回复
fstream没有任何问题,我现在用来读取文件已经没有任何问题了,需要注意的是传递给read的第一个参数。
逸学堂 2006-02-15
  • 打赏
  • 举报
回复
fstream,在读取二进制文件时有问题。
写过一个基于二进制文件拷贝的类,开始使用fstream发现有问题
拷贝不了。
后来改用MFC的CFile,发现超级好用。
定义CFile file;
file.open("文件名",CFile::modeRead | CFile::typeBinary);
之后就read,write就可以了
具体参考
http://www.exuetang.net/News/View.aspx?NewsID=20
kinglytt 2006-02-15
  • 打赏
  • 举报
回复
VC默认是文本方式打开,而文本文件结束符好像就是1Ah。以前碰过这样的问题,加上ios_base::binary就可以了。
如果你不是处理文本的话,用文本方式打开会出现n多问题。比如fstream会在读入内存的时候把0Ah,0Dh只读成一个0Ah,等等,所以除非处理文本,否则尽量用二进制打开。
strangerryf 2006-02-15
  • 打赏
  • 举报
回复
不是在00处,而是"00附近"。
#include <fstream>
#include <string>
#include <iostream>

using namespace std;

int main()
{
ifstream f("a.stg", ios_base::binary);

if (f.is_open())
{
f.seekg(0L, ios::end);
int len = f.tellg();

char c;
f.seekg(0L, ios::beg);

for(int i = 0; i < len; i++)
{
f.read(&c, 1);
printf("%X ", (unsigned char)c);
}
}
return 0;
}
Linux2001 2006-02-15
  • 打赏
  • 举报
回复
大哥,fstream会在1A处停下来不会在00处停下,请你把代码和文件用来试验一下就知道了
strangerryf 2006-02-15
  • 打赏
  • 举报
回复
fstream f("C:\\a.stg");应改为ifstream f("C:\\a.stg", ios_base::binary);
vs的编译器默认打开是文本格式,gcc是二进制格式。因此fstream在00附近就停下来了。

64,649

社区成员

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

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