VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 869|回复: 3

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

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-2-22 11:30:01 | 显示全部楼层 |阅读模式
我用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();
    }
}
回复

使用道具 举报

0

主题

14

帖子

15.00

积分

新手上路

Rank: 1

积分
15.00
发表于 2020-5-4 09:45:01 | 显示全部楼层
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);
回复

使用道具 举报

0

主题

55

帖子

44.00

积分

新手上路

Rank: 1

积分
44.00
发表于 2020-5-4 11:15:01 | 显示全部楼层
首先,打开文件必须用bin模式。
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-6-3 13:00:01 | 显示全部楼层
ou a~~~~必须用binary方式。。。
我后来用fopen() b 模式打开,
就可以了。

好的,谢谢大家~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表