关于fstream read函数的有关问题
关于fstream read函数的问题
我在用标准C++编写一个BMP文件读写的程序,不用MFC,使用fstream中的read函数从BMP文件中读取文件头信息,代码如下:
fstream bmpfile;
bmpfile.open(filename,ios::in|ios::binary);
if(!bmpfile)
return FALSE;
bmpfile.read((char*)(&m_BMPHEADER),sizeof(m_BMPHEADER));
文件头结构体为:
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef char CHAR;
typedef long LONG;
typedef int BOOL;
#define FALSE 0;
#define TRUE -1;
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2l; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
// 文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;
读取的结果是有问题的,第一个成员WORD bfType读了4个字节,但是只存储了两个字节,也有可能不是这么解释,相关实验数据如下:
源文件数据:
00000000h:42 4D 86 7F 06 00 00 00 00 00 36 04 00 00 28 00 00 00 FC
结果的结构体数据为:
WORD bfType 19778 (7F 86 4D 42 只保留了4D 42)
DWORD bfSize 6 (00 00 00 06)
WORD brReserved1 0 (00 00)
WORD brReserved2 1078 (04 36)
DWORD bfOffBits 2621440 (00 28 00 00)
请高手指点问题所在,以及改进办法,十分感谢!
------解决方案--------------------
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 );
}
------解决方案--------------------
数据对齐可是基本常识啊, 呵呵
------解决方案--------------------
呵~记得之前这里还有人问了一个问题,也是数据对齐的原因~~~
我在用标准C++编写一个BMP文件读写的程序,不用MFC,使用fstream中的read函数从BMP文件中读取文件头信息,代码如下:
fstream bmpfile;
bmpfile.open(filename,ios::in|ios::binary);
if(!bmpfile)
return FALSE;
bmpfile.read((char*)(&m_BMPHEADER),sizeof(m_BMPHEADER));
文件头结构体为:
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef unsigned char BYTE;
typedef char CHAR;
typedef long LONG;
typedef int BOOL;
#define FALSE 0;
#define TRUE -1;
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为BM
DWORD bfSize; // 位图文件的大小,以字节为单位
WORD bfReserved1; // 位图文件保留字,必须为0
WORD bfReserved2l; // 位图文件保留字,必须为0
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图
// 文件头的偏移量表示,以字节为单位
}BITMAPFILEHEADER;
读取的结果是有问题的,第一个成员WORD bfType读了4个字节,但是只存储了两个字节,也有可能不是这么解释,相关实验数据如下:
源文件数据:
00000000h:42 4D 86 7F 06 00 00 00 00 00 36 04 00 00 28 00 00 00 FC
结果的结构体数据为:
WORD bfType 19778 (7F 86 4D 42 只保留了4D 42)
DWORD bfSize 6 (00 00 00 06)
WORD brReserved1 0 (00 00)
WORD brReserved2 1078 (04 36)
DWORD bfOffBits 2621440 (00 28 00 00)
请高手指点问题所在,以及改进办法,十分感谢!
------解决方案--------------------
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 );
}
------解决方案--------------------
数据对齐可是基本常识啊, 呵呵
------解决方案--------------------
呵~记得之前这里还有人问了一个问题,也是数据对齐的原因~~~