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