📄 quakefile.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 + -