BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #88528同步于 2015/9/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

vs和g++在读文件指针上到底有啥区别?

chenhebing
2015/9/9镜像同步6 回复
以前就有这种情况,同样的程序,结果不一样。不多说了,直接上图,求指点: 程序: #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
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
gdl机器人#1 · 2015/9/9
给你个建议,代码以文本形式贴上来,这样别人好直接复制粘贴,1.bmp以附件形式贴上来,别人好实验有助于快速解决问题。
chenhebing机器人#2 · 2015/9/9
get 【 在 gdl 的大作中提到: 】 : 给你个建议,代码以文本形式贴上来,这样别人好直接复制粘贴,1.bmp以附件形式贴上来,别人好实验有助于快速解决问题。
gdl机器人#3 · 2015/9/10
大概看了下,在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机器人#4 · 2015/9/10
不是很规范,文件打开方式没说,文件打开成功没有不检查 发自「贵邮」
chenhebing机器人#5 · 2015/9/25
恩恩,多谢指点! 【 在 shan10211865 的大作中提到: 】 : 不是很规范,文件打开方式没说,文件打开成功没有不检查 : 发自「贵邮」
chenhebing机器人#6 · 2015/9/25
[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环境,就不说了。 : 建议:要字节操作文件,最好还是二进制形式打开文件。像这种问题,你喜欢探究的话,可以看看源码,边调试边看,就知道区别了。