首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

ifstream用read(*)读取一个5m的文件,没有读完就eof了解决办法

2012-02-20 
ifstream用read(*)读取一个5m的文件,没有读完就eof了我用ifstream读取一个5m的BMP文件,每次读取4个字节,但

ifstream用read(*)读取一个5m的文件,没有读完就eof了
我用ifstream读取一个5m的BMP文件,每次读取4个字节,但是在读到3712×4个字节的时候,就eof了,
每次都是在那里停掉。不知道什么原因。
求助


/////////////////////////////////////差值生成文件///////////////////////////////////////////
//生成一个bmp的差值图形文件,在这个文件中,所有有变化的点,都为白色:FF   FF   FF
//没有变化的点都是黑色:00   00   00
//再生成一个差值文件。即对于每一个点,使用S8模式,保留差值
//
///////////////////////////////////////////////////////////////////////////////////////////
void   MakeDisFile(char   *   filepath,   int   filenum)//filenum:文件数量,文件名,对应为1。bmp~filenum。bmp
{
int   headlength=54;
char   BMPfilename0[100],BMPfilename1[100],Bisfilename[100],Disfilename[100];
char   FileHeader[54];
unsigned   char   FF[]={255,255,255,255};
unsigned   char   OO[]={0,0,0,0};
int   sizePixel;
int   countpixel;
typedef   unsigned   char   Pixel[4];
Pixel   pixel0,pixel1,Dispixel;
for(int   i=1;i <=filenum;i++)
{
sprintf(BMPfilename0, "%s\\%d.bmp ",filepath,i);//当前file
sprintf(BMPfilename1, "%s\\%d.bmp ",filepath,i);//next   file
sprintf(Bisfilename, "%s\\Bis%d.bmp ",filepath,i);//Bisfilename:差值图形文件
sprintf(Disfilename, "%s\\Dis%d.dat ",filepath,i);//Disfilename:差值数值文件

ifstream   ifr0(BMPfilename0);
ifstream   ifr1(BMPfilename1);
ofstream   ofrBMP(Bisfilename);
ofstream   ofrDis(Disfilename);
ifr0.read(FileHeader,headlength);//read   out   the   file   header,and   then   write   to   the   Bisfilename
ofrBMP.write(FileHeader,headlength);

ifr1.seekg(headlength);

countpixel=0;

sizePixel=FileHeader[28]/8;//bitperpixel   /8=byteperpixel
while   (!ifr1.bad())
{
countpixel++;
ifr0.read((char*)pixel0,sizePixel);
ifr1.read((char*)pixel1,sizePixel);
int   dis=0;
for   (int   tem_i=0;tem_i <sizePixel;tem_i++)
{
Dispixel[tem_i]=pixel0[tem_i]-pixel1[tem_i];//for   the   distance
dis+=Dispixel[tem_i];//dis   累加整个dis值,当0:没有变化
}
//Dispixel差值写入文件Disfile
ofrDis.write((const   char*)Dispixel,sizePixel);

//如果Dispixel是000,表明这个点没有变化,则写入Bisfile为00   00   00
//if   the   dispixel   is   not   000   then   write   'FF   FF   FF 'to   Bisfile  
if   (dis)
{//只要有一个为非0,则表示有变化
ofrBMP.write((const   char   *)FF,sizePixel);
}
else//没有变化
{
ofrBMP.write((const   char   *)OO,sizePixel);
}
if   (ifr0.eof())
{
int   temp;
temp=countpixel;
}
}
ifr0.close();
ifr1.close();
ofrBMP.close();
ofrDis.close();
        }
}

[解决办法]
ifstream ifr0(BMPfilename0, ios_base::in | ios_base::binary);
ifstream ifr1(BMPfilename1, ios_base::in | ios_base::binary);
ofstream ofrBMP(Bisfilename, ios_base::out | ios_base::trunc | ios_base::binary);
ofstream ofrDis(Disfilename, ios_base::out | ios_base::trunc | ios_base::binary);
[解决办法]
首先,打开文件必须用bin模式。

热点排行