⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 quakefile.cpp

📁 本程序源码是为日本一家地震监测机构编写的
💻 CPP
字号:
// QuakeFile.cpp: implementation of the CQuakeFile class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "QuakeFile.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

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

CQuakeFile::CQuakeFile()
{
	m_PathName.Empty();
	m_dispArray.RemoveAll();
	
	m_AbsMaxDisp   = 0.0;
	m_MinusMaxDisp = 0.0;
	m_PlusMaxDisp  = 0.0;
}

CQuakeFile::~CQuakeFile()
{
	m_dispArray.RemoveAll();
}


//函数作用: 加载指定的路径和文件名的数据文件
//输入参数: pathname包含路径和文件名的字符串,bReload指定是否重复加载上
//          次已经加载过的数据文件,该参数主要用来提高数据的加载速度,避
//          免不必要的重复加载,函数默认调用bReload = FALSE,不重复加载
//返回值  : FALSE 文打开错误  TRUE 数据文件成功加载
BOOL CQuakeFile::LoadFile(CString pathname, BOOL bReLoad/* = FALSE*/)
{
	if(!bReLoad && pathname == m_PathName) return TRUE;
    //加载文件/////////////////////////////////////////////
	m_dispArray.RemoveAll();
	m_PathName = pathname;
	
	m_AbsMaxDisp   = 0.0;
	m_MinusMaxDisp = 0.0;
	m_PlusMaxDisp  = 0.0;

	CStdioFile myFile;
	CFileException e;
    
	if(!myFile.Open(pathname, CFile::modeRead, &e))
	{
		AfxMessageBox(_T("Open File ERROR!"));
		return FALSE;
	}

	CString Temp;                   //临时保存读出来的数据
	int iReadLines(0);              //记录读的行数
	int iCutPos(0);                 //记录\t在字符串中的位置
	CString stime,sdisp;            //分别保存时间和偏移量字符串
	DispStruct DispItem;            //数组的一个Item变量
	DispStruct AddItem;             //修正,纠错的Item变量
	while(myFile.ReadString(Temp))
	{		
		//数据校检:判断该行是否为合法数据///////////////////////////////
		//校检条件
		// 1 - 该行长度小于11为损坏数据(未采用)
		// 2 - 该行未发现数据分割符 \t 为损坏数据
		// 3 - 该行第一个字符不是数字(即判断ASCII是否在48-57之间)为损坏数据
		// 更多......可以继续添加
		iCutPos = Temp.Find('\t');
		if(iCutPos == -1 || int(Temp[0]) > 57 || int(Temp[0]) < 48)continue;

		//数据转化/////////////////////////////////////////////////////
		stime = Temp.Left(iCutPos);
		sdisp = Temp.Mid(iCutPos+1);
		iCutPos = stime.Find('.');
		if(iCutPos == -1) stime += "00";
		else
		{
			if((stime.GetLength() - iCutPos -1) == 1)
				stime += "0";
			stime.Remove('.');
		}		
		DispItem.Time = _ttoi(stime);
		DispItem.Disp = _tcstod(sdisp,NULL);

		//数据修正段/////////////////////////////////////////////////
		//将数据加入Array,但是需要判断是否数据存在时间上的断层
		//如果发现数据时间上不连续,自动加入0补充
		//时间不连续有两种情况
		// 1 是下一个数据的时间小于等于上一个时间
		// 2 是下一个数据的时间大于上一个时间+1
		// 第一种情况直接跳过不进行任何处理,继续读数据
		// 直至发现正确的数据点或者是第2中情况的数据再进行处理
		if(DispItem.Time < iReadLines)
		{
			//When this AfxMessageBox is appears,It means that:
			//There are some bad datas in reading file.
			//At Most time, this three line below would only work for debugs
		/*	CString sModify;
			sModify.Format("Temp:%s  ReadLines:%d   DispItem.Time:%d",Temp,iReadLines,DispItem.Time);
			AfxMessageBox(sModify);/**/
			continue;
		}
		for(int i = iReadLines; i < DispItem.Time; i++)
		{
			//When this four lines below works,It means that:
			//a data which was not reading from data file was created 
			//by programe automatically. this data will instead of the 
			//lost data in Data file.lost data will be Default set to zero
			AddItem.Time = iReadLines;
			AddItem.Disp = 0;
			iReadLines++;
			m_dispArray.Add(AddItem);
		}
		iReadLines++;
		m_dispArray.Add(DispItem);
		//比较保存最大正负位移量
		if(DispItem.Disp > m_PlusMaxDisp)  m_PlusMaxDisp  = DispItem.Disp;
		if(DispItem.Disp < m_MinusMaxDisp) m_MinusMaxDisp = DispItem.Disp;
		continue;
	}
	myFile.Close();
	m_dispArray.SetSize(iReadLines);
	//更新最大绝对值位移
	fabs(m_MinusMaxDisp) > m_PlusMaxDisp ? m_AbsMaxDisp = fabs(m_MinusMaxDisp) : m_AbsMaxDisp = m_PlusMaxDisp;
	return TRUE;
}

//获得文件数据的长度
int CQuakeFile::GetDataSize() const
{
	return m_dispArray.GetSize();
}

//获得指定时间点的数据
BOOL CQuakeFile::GetDispData(int time, DispStruct &dispitem) const
{	
	if(m_dispArray.GetSize() == 0 
		|| time < 0 
		|| time > (m_dispArray.GetSize() -1)) 
		return FALSE;
	dispitem.Time = m_dispArray[time].Time;
	dispitem.Disp = m_dispArray[time].Disp;
	return TRUE;
}

//获得最大偏移量的绝对值
double CQuakeFile::GetAbsMaxdisp() const
{
	return m_AbsMaxDisp;
}

double CQuakeFile::GetMinusMaxDisp() const
{
	return m_MinusMaxDisp;
}

double CQuakeFile::GetPlusMaxdisp() const
{
	return m_PlusMaxDisp;
}

⌨️ 快捷键说明

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