读写文件时00 0A与80 0A的bug

版权声明:博主原创文章,可以转载,但要注明出处。维护版权,人人有责。 https://blog.csdn.net/dongdong_csdn/article/details/77608629

苦于手头没有16位的图像,于是想用程序画一个来替代。就是从0开始一直加到65535,看起来是一种由暗渐变到亮的效果。生成的程序很简单

uint16_t i(0),j(0);
    ofstream outf("IAmRaw.txt");//输出文件
    for (i = 0; i < 512; i++)
    {
        for (j = 0; j < 512; j++)
        {
            t = j * 128;
            outf << (uchar)t;// &0x00ff);
            outf << (uchar)(t >> 8);// &0x00ff);
        }
    }
    outf.close();

读取的程序也不多

    FILE *RAWFile;
    errno_t err;
    char *RAWAddr;
    //char unknown[2048];
    err = fopen_s(&RAWFile, RAWFlieName, "rb");
    if (err == 0)
    {
        //cout << "The file "<<RAWFlieName<<" was opened"<< endl ;
        //fseek(RAWFile, 0, SEEK_END);
        int rawFileSize = IMAGECOL*IMAGEROW*2;// ftell(RAWFile);
        RAWAddr = new char[rawFileSize];
        rewind(RAWFile);
        //cout << RAWAddr;
        //_fread_nolock(unknown, sizeof(char), 1024, RAWFile);//
        if (!rawFileSize == _fread_nolock(RAWAddr, sizeof(char), rawFileSize, RAWFile))
        {
            fclose(RAWFile);
            delete[] RAWAddr;
            cout << "读取文件 " << RAWFlieName << " 失败!!" << endl;
            return -1;
        }
        //cout << sizeof(RAWAddr);
        //printf("%s", RAWAddr);
        if (RAWFile)
        {
            err = fclose(RAWFile);
            if (err != 0)
            {
                cout << "关闭文件 " << RAWFlieName << " 失败!" << endl;
            }
            //memset(rawData,0,sizeof(rawData));
            for (i = 0; i < IMAGEROW; i++)//reorder gray
            {
                for (j = 0; j < IMAGECOL; j++)
                {
                    unsigned short pointH = (unsigned short)*(RAWAddr + (i*IMAGECOL + j) * 2 + 1);
                    rawData[i][j] = (pointH << 8) + (uchar)*(RAWAddr + (i*IMAGECOL + j) * 2);
                }
            } 
            delete[] RAWAddr;   

但是显示成图像就成了这样
这里写图片描述
仔细观察每一行不但多出了一个点,在较暗的区域还有一个特别亮的点,仔细分析数据发现原本应该是2560、2688的两个点变成了3328、32778、2573这三个数。调了一晚上,几乎崩溃。简直无解!!!!!
于是我又专门用2560和2688写了一个文件,发现文件很大(相比较从前)。使用Binary viewer软件一看,发现在每一个00与0A、80与0A中间都多出了一个0D。再查看原文件,如图:
这里写图片描述
这是为什么呢?
查一下ASCii表发现0D是回车键,0A是换行建,而windows使用的换行符为\r\n;windows系统中对于换行\n是自动加上\r的。这样一来就发现了其中的原由。
是在写入文件时出现了0A,window系统认为我输入的是换行\n,于是自动加上了一个\r即0D;于是我原来的编码就乱了套,出现了图中的白线。
对程序作如下修改


if (RAWFile)
        {
            err = fclose(RAWFile);
            if (err != 0)
            {
                cout << "关闭文件 " << RAWFlieName << " 失败!" << endl;
            }
            //memset(rawData,0,sizeof(rawData));
            rn = RAWAddr;
            for (i = 0; i < IMAGEROW; i++)//reorder gray
            {
                for (j = 0; j < IMAGECOL; j++)
                {

                    if (*(rn+1) == 0x0d && *(rn+2) == 0x0a)
                    {
                        rn++;
                    }
                    unsigned short pointH = (unsigned short)*(rn+1);
                    rawData[i][j] = (pointH << 8) + (uchar)*(rn);
                    rn+=2;
                }
            } 

读回图片如下:
这里写图片描述

展开阅读全文

没有更多推荐了,返回首页