返回信息流以前就有这种情况,同样的程序,结果不一样。不多说了,直接上图,求指点:
程序:
#include "stdafx.h"
#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
ifstream fin("D:\\TwoDimensionCode\\1.BMP");
int beginIndex = 0;
int width = 0;
int height = 0;
unsigned char c;
fin.seekg(10, ios::cur);
for (int i = 0; i < 4; ++i){
fin >> c;
beginIndex |= (int)c << (i * 8);
}
cout << beginIndex << endl;
fin.seekg(4, ios::cur);
for (int i = 0; i < 4; ++i){
fin >> c;
width |= (int)c << (i * 8);
}
cout << width << endl;
fin.close();
return 0;
}
vs运行结果:
g++运行结果:
这是1.BMP文件的hex数据。vs显示的高亮部分。
附件(350B) 1.BMP
这是一条镜像帖。来源:北邮人论坛 / cpp / #88528同步于 2015/9/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
vs和g++在读文件指针上到底有啥区别?
chenhebing
2015/9/9镜像同步6 回复
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
get
【 在 gdl 的大作中提到: 】
: 给你个建议,代码以文本形式贴上来,这样别人好直接复制粘贴,1.bmp以附件形式贴上来,别人好实验有助于快速解决问题。
大概看了下,在Windows上,fin("D:\\TwoDimensionCode\\1.BMP")以文本形式打开文件,导致了fin.seekg(4, ios::cur);这句执行出错了,但没报异常且继续执行,这里出错造成了指针回滚到了3e位置,同时也使得fin这个流里面很多东西混乱了,然后执行到fin >> c;时候,检测到了错误,重新打开了次文件,但是这次打开文件由于文件句柄等等因素,造成了读取文件的错误,也就是从你高亮的位置开始读取的。这一系列问题是和Windows系统和ifstream类实现有关。解决方法就是以二进制形式打开文件fin("D:\\TwoDimensionCode\\1.BMP",ios::binary)。没Linux环境,就不说了。
建议:要字节操作文件,最好还是二进制形式打开文件。像这种问题,你喜欢探究的话,可以看看源码,边调试边看,就知道区别了。
恩恩,多谢指点!
【 在 shan10211865 的大作中提到: 】
: 不是很规范,文件打开方式没说,文件打开成功没有不检查
: 发自「贵邮」
[ema20]太感谢了!学习了!
【 在 gdl 的大作中提到: 】
: 大概看了下,在Windows上,fin("D:\\TwoDimensionCode\\1.BMP")以文本形式打开文件,导致了fin.seekg(4, ios::cur);这句执行出错了,但没报异常且继续执行,这里出错造成了指针回滚到了3e位置,同时也使得fin这个流里面很多东西混乱了,然后执行到fin >> c;时候,检测到了错误,重新打开了次文件,但是这次打开文件由于文件句柄等等因素,造成了读取文件的错误,也就是从你高亮的位置开始读取的。这一系列问题是和Windows系统和ifstream类实现有关。解决方法就是以二进制形式打开文件fin("D:\\TwoDimensionCode\\1.BMP",ios::binary)。没Linux环境,就不说了。
: 建议:要字节操作文件,最好还是二进制形式打开文件。像这种问题,你喜欢探究的话,可以看看源码,边调试边看,就知道区别了。