基本代码:
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;
}