在進行圖片數據保存時候踩的坑,fwrite實際寫入文件的數據大小比參數指定的數值大一些字節,原因是:win下用文本方式讀寫文件,會在0A(換行)前加0D(回車)

基本代碼:

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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章