在进行图片数据保存时候踩的坑,fwrite实际写入文件的数据大小比参数指定的数值大一些字节,原因是:win下用文本方式读写文件,会在0A(换行)前加0D(回车)

您所在的位置:网站首页 setupvpn铁de銭0d銭0a 在进行图片数据保存时候踩的坑,fwrite实际写入文件的数据大小比参数指定的数值大一些字节,原因是:win下用文本方式读写文件,会在0A(换行)前加0D(回车)

在进行图片数据保存时候踩的坑,fwrite实际写入文件的数据大小比参数指定的数值大一些字节,原因是:win下用文本方式读写文件,会在0A(换行)前加0D(回车)

2023-07-02 20:47| 来源: 网络整理| 查看: 265

基本代码:

fp = fopen(filename,"w");

fwrite(buf,sizeof(unsigned char), 96,fp);

fclose(fp);  

而后查看文件大小不是96,而是101.  

把文件和buf内容比较,发现差异是,buf中所有出现0x0a的地方,文件中都会多出一个0x0d,其他内容则正常。  

在一个论坛上看到“win下用文本方式读写文件,会在0A(换行)前加0D(回车)”,解决办法是“以二进制形式打开文件,WIN下不会在0A(换行)前加0D(回车)”;

 

踩坑点:

/// // 保存bin文件 bool CGsStreamSave::SaveToFile(CGpStream &stream, CGpString& strFileType) { CGpImage img = stream.Image(); INT64 i64TimeStamps = stream.Image().timestamp(); INT32 nCcds = stream.ccds(); INT32 nSubs = stream.subs();; INT32 nStreamType = stream.Type(); //*** 在CGpProtocolGvspReceiver中接收组装数据图像帧时,不匹配的数据帧不入队列,在此处再做了一次判断 CGpString strSaveDateTime = stream.StrSaveDateTime(); if (strSaveDateTime.empty()) { return false; } if (img.Buffer().empty()) { return false; } string strStreamName; char szFileName[256]; memset(szFileName, 0, 256); string strDataTime = ""; switch (nStreamType) { case Gp::STREAM_TYPE_DEEP: // depth流 { strStreamName = "depth"; } break; case Gp::STREAM_TYPE_RGB: // rgb流 { strStreamName = "rgb"; } break; default: { //error log... return false; } break; } if (strStreamName.empty()) { return false; } sprintf(szFileName, "SaveData/bin/%s/%s_%s_ccd%d_subs%d.bin", strStreamName.data(), strSaveDateTime.data(), strStreamName.data(), nCcds, nSubs, strFileType.data()); #ifdef _DEBUG //记录耗时 char szTm[128]; memset(szTm, 0, 128); SYSTEMTIME sys; GetLocalTime(&sys); sprintf(szTm, "%4d-%02d-%02d %02d:%02d:%02d.%03d", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond, sys.wMilliseconds); LARGE_INTEGER g_liPerfFreq = { 0 }; QueryPerformanceFrequency(&g_liPerfFreq); LARGE_INTEGER m_liPerfStart = { 0 }; QueryPerformanceCounter(&m_liPerfStart); unsigned int curThdId = GetThreadId(); #endif FILE* fp = fopen(szFileName, "wb"); //*******这里一定要使用wb 不能使用w a+等,否则保存出来的图片数据会和写入时,设置的数值不一样大小 if (!fp) { return false; } int nSize = img.Buffer().size(); #ifdef _DEBUG if (nStreamType == Gp::STREAM_TYPE_RGB) // depth流 { _printf("SaveToIni thdId=[%d] size=[%d]\n", curThdId, nSize); } #endif fwrite((const void*)img.Buffer().data(), nSize, sizeof(char), fp); fclose(fp); #ifdef _DEBUG LARGE_INTEGER liPerfNow = { 0 }; // 计算CPU运行到现在的时间 QueryPerformanceCounter(&liPerfNow); int nCostTime = (((liPerfNow.QuadPart - m_liPerfStart.QuadPart) * 1000) / g_liPerfFreq.QuadPart); //_printf("SaveToIni thdId=[%d] 耗时=[%d] streamType=[%d] width=[%d] height=[%d] count=[%d]\n", curThdId, nCostTime, nStreamType, stream.img().width(), stream.img().height(), StreamsCount()); #endif return true; }

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3