trajfileaccess.cpp

来自「VC&Matlab混合编程实现无线电导航指示器」· C++ 代码 · 共 177 行

CPP
177
字号
// TrajFileAccess.cpp: implementation of the CTrajFileAccess class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RADIO.h"
#include "TrajFileAccess.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTrajFileAccess::CTrajFileAccess()
{m_bFileInitialized=FALSE;

}

CTrajFileAccess::~CTrajFileAccess()
{

}

BOOL CTrajFileAccess::InitializeFileAccess(LPCTSTR lpszFileName)
{//初始化时读了一个时间点的数据,文件位置也在第一个数据包之后
	CFileException fileExcep;
	m_fileTraj.Open(lpszFileName, CFile::modeRead,&fileExcep);
	if(fileExcep.m_cause!=CFileException::none)	
	{  fileExcep.ReportError();
	    return FALSE;
	}
	int pbuf[1];
	TRY{
		m_fileTraj.SeekToBegin();
		m_fileTraj.Read(pbuf, sizeof(int));}
	CATCH(CFileException, pEx){
		m_fileTraj.Close();
		pEx->ReportError();
	}
	END_CATCH
	m_npackageCount=pbuf[0];
	m_nCurrentPackageIndex=1;
	if (m_npackageCount<=0){
		AfxMessageBox("航迹数据文件格式错误!");
		return FALSE;
	}
	DWORD dwFileLength;
	TRY{
		dwFileLength=m_fileTraj.GetLength();
	}
	CATCH(CFileException, pEx){
		pEx->ReportError();
	}
	END_CATCH
		DWORD dwLength=m_npackageCount*sizeof(TRAJ)+sizeof(int);
		if(dwLength!=dwFileLength){
			AfxMessageBox("航迹数据文件格式错误!");
			return FALSE;
		}
		
		TRY{
			m_fileTraj.Read(&m_CurrentPackageData, sizeof(TRAJ));}
		CATCH(CFileException, pEx){
			pEx->ReportError();
		}
		END_CATCH
		m_bFileInitialized=TRUE;
		//计算航迹时间周期
        TRAJ secondPackageData;
		TRY{
			m_fileTraj.Read(&secondPackageData, sizeof(TRAJ));
		    }
		CATCH(CFileException, pEx){
			pEx->ReportError();
		}
		END_CATCH
		m_dPeroid=secondPackageData.t-m_CurrentPackageData.t;
		if(m_dPeroid<=0){
			AfxMessageBox("航迹数据文件格式错误!");
			return FALSE;
		}
		TRY{
		m_fileTraj.Seek(-(LONG)sizeof(TRAJ),CFile::current);
		}
		CATCH(CFileException, pEx){
			pEx->ReportError();
		}
		END_CATCH
		return TRUE;
}



void CTrajFileAccess::EndFileAccess()
{
	TRY{
		if(m_fileTraj.m_hFile!=CFile::hFileNull)  {
			m_fileTraj.Close();
			m_fileTraj.m_hFile=CFile::hFileNull;
		}
	}
	CATCH(CFileException, pEx){
		pEx->ReportError();
	}
	END_CATCH
}

BOOL CTrajFileAccess::RefreshCurrentPackageByStep(LONG step)
//更新当前TRAJ数据包,step可以为正也可以为负,index超出了范围则返回FALSE,更新成功返回TRUE
{
	if(!m_bFileInitialized) {
		AfxMessageBox("文件未初始化错误!");
		return FALSE;
	}
	if(step==0) return TRUE;
	LONG lIndex=m_nCurrentPackageIndex+step;
	if (lIndex<=0 ) {
		AfxMessageBox("数据包索引溢出!");
		return FALSE;
	}
	if((DWORD)lIndex>m_npackageCount){
        return FALSE;
	}	

	TRY{
	m_fileTraj.Seek((LONG)((step-1)*sizeof(TRAJ)),CFile::current);
	}
	CATCH(CFileException, pEx){
		pEx->ReportError();
	}
	END_CATCH
	TRY{
		m_fileTraj.Read(&m_CurrentPackageData, sizeof(TRAJ));}
	CATCH(CFileException, pEx){
		pEx->ReportError();
	}
	END_CATCH
	m_nCurrentPackageIndex+=step;
	return TRUE;

}

BOOL CTrajFileAccess::RefreshCurrentPackageByTime(double time)
{	if(!m_bFileInitialized) {
		AfxMessageBox("文件未初始化错误!");
		return FALSE;
	}
    if(time<0) {
		AfxMessageBox("时间索引错误!");
		return FALSE;
	}
	double previouTime=m_CurrentPackageData.t;
	double eTime=time-previouTime;
	double dStep=eTime/m_dPeroid;
	LONG lStep;
	if(dStep>1.0e-6){
         lStep=(LONG)(dStep+.5);//加0.5是四舍五入
	}
	else if(dStep<-1.0e-6){
         lStep=-(LONG)(-dStep+.5);
	}else{
		lStep=0;
	}
	return RefreshCurrentPackageByStep(lStep);

}

TRAJ CTrajFileAccess::GetCurrentPackageData()
{
return m_CurrentPackageData;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?