在进行图片数据保存时候踩的坑,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;
}

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隨意的風

如果你觉得有帮助,期待你的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值