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

📄 databuffer.cpp

📁 中央气象台与日本台风数据之间的格式转换程序
💻 CPP
字号:
#include "stdafx.h"
#include "DataBuffer.h"

#define IsDigital(C)    (('0' <= (C)) && ((C) <= '9'))
#define CONST_STRING    ",150,0,0,0"


const char* szMark[] = { "UT","mb","kt" };

CDataBuffer::CDataBuffer()
{

}

CDataBuffer::~CDataBuffer()
{
	Clear();

}

void CDataBuffer::AddString(CString& csValue)
{
	if ( !VerifyString(csValue) )
		return ;
    CString csName;

	csName = GetName(csValue);
	DATARECORD* pRecord;
	int nCount = m_Recordset.GetSize();
	for (int i = 0  ; i < nCount ; i++)
    {
		pRecord = (DATARECORD*)m_Recordset.GetAt(i);
		if ( pRecord )
        {
			if ( !strcmp( csName.GetBuffer(csName.GetLength()), pRecord->szName ) )
			{
				pRecord->dataList.AddTail(csValue);
				return;
			}	
		} 
    }
	pRecord = new DATARECORD;
	if ( pRecord == NULL )
    {
		::AfxMessageBox("分配内存失败!");
		return;
	}
	memset( pRecord->szName , 0 , 64);
	strcpy( pRecord->szName , csName.GetBuffer(csName.GetLength()));
	pRecord->dataList.AddHead(csValue);  
	m_Recordset.Add(pRecord); 
	
}

void CDataBuffer::Clear()
{
	DATARECORD* pRecord;
	int i = m_Recordset.GetSize()-1;
	
	for ( ; i >= 0 ; i--)
    {
		pRecord = (DATARECORD*)m_Recordset.GetAt(i); 
		m_Recordset.RemoveAt(i);
		if ( pRecord != NULL )
			delete pRecord;
    } 
}

UINT32 CDataBuffer::GetCount()
{
	return m_Recordset.GetSize(); 

}

BOOL  CDataBuffer::VerifyString(CString& csValue)
{
	int i,nPos;
	for ( i = 0 ; i < 4 ; i++ )
    {
		if ( !IsDigital(csValue.GetAt(i)) ) 
			return FALSE;	
    } 
	for ( i = 0 ; i < 3 ; i++ )
    {
		nPos = csValue.Find( szMark[i]);
		if ( nPos <= 0 )
			return FALSE;
	}
	return TRUE;

}

CString CDataBuffer::GetName(CString& csValue)
{
	int nPos1,nPos2;
    CString csName = _T("");

	nPos1 = csValue.Find("W",0);
	nPos2 = csValue.Find("E",0);
	if ( nPos1 <= 0 && nPos2 <= 0 )
		return _T("");
	if ( nPos1 >0 && nPos2 >0  && nPos1 > nPos2)
		nPos1 = nPos2;
	else if ( nPos1 < 0 )
		nPos1 = nPos2;
	nPos2 = csValue.Find(" " , nPos1+2);
	if ( nPos2 <= 0 )
			return _T("");
    csName = csValue.Mid(nPos1+2 , nPos2 - nPos1-2);
	return csName;

}

BOOL CDataBuffer::OutputData(CString csFileName)
{
	int nPos1,nPos2,nPos3;;
	DATARECORD* pRecord;
	CStdioFile fd;
	//"West Pacific","KATE",9901,"中央气象台","Finish"
	fd.Open(csFileName , CFile::modeCreate  | CFile::modeReadWrite);
	if (fd.m_hFile == NULL )
		return FALSE;
    int i,j;	
	int nCount = m_Recordset.GetSize();
	for (i = 0  ; i < nCount ; i++)
    {
		pRecord = (DATARECORD*)m_Recordset.GetAt(i);
		if ( pRecord )
        {
			CString csValue = pRecord->dataList.GetAt((pRecord->dataList.FindIndex(0)));
			fd.WriteString("\"");
			fd.WriteString("West Pacific");
			fd.WriteString("\",");
			fd.WriteString("\"");
			fd.WriteString(pRecord->szName);
			fd.WriteString("\",");
			fd.WriteString(csValue.Left(4));
			fd.WriteString(",\"");
			fd.WriteString("中央气象台");
			fd.WriteString("\",");
			fd.WriteString("\"");
			fd.WriteString("Finish");
			fd.WriteString("\"\n");
			
			for ( j = 0 ; j < pRecord->dataList.GetCount() ; j++ )
			{
				CString csValue = pRecord->dataList.GetAt(pRecord->dataList.FindIndex(j));
				CString csResult = "#";
				CString csTemp;

				nPos3 = csValue.Find("UT"); 
				csResult = csResult + csValue.Left(4) + "-";
				csTemp = csValue.Mid(5,2);
			    csTemp.TrimRight();
				if ( csTemp.GetLength() < 2)
					csTemp = "0" + csTemp;
				csResult = csResult + csTemp + "-" + csValue.Mid(7,2) + " " +  csValue.Mid(10,2) + ":00:00#";
				nPos1 = csValue.Find("N",0);
				nPos2 = csValue.Find("S",0);
				if ( nPos1 > 0 && nPos2 > 0 && nPos1 <= nPos2 )
                { 
					csResult = csResult + ",0," + csValue.Mid(nPos3 + 3,nPos1-nPos3-4) + ",";
					nPos3 = nPos1 + 2;
                } 
				else if ( nPos1 > 0 && nPos2 > 0 && nPos1 > nPos2 )
                { 
					csResult = csResult + ",0,-" + csValue.Mid(nPos3 + 3,nPos2-nPos3-4) + ",";
					nPos3 = nPos2 + 2;
                }
				else if ( nPos1 > 0 && nPos2 < 0 )
                {
					csResult = csResult + ",0," + csValue.Mid(nPos3 + 3,nPos1-nPos3-4) + ",";
					nPos3 = nPos1 + 2;
                } 
				else if ( nPos1 < 0 && nPos2 > 0 )
                { 
					csResult = csResult + ",0,-" + csValue.Mid(nPos3 + 3,nPos2-nPos3-4) + ",";
					nPos3 = nPos2 + 2;
                }  
				nPos1 = csValue.Find("E",0);
				nPos2 = csValue.Find("W",0);
				if ( nPos1 > 0 && nPos2 > 0 && nPos1 <= nPos2 )
					csResult = csResult +   csValue.Mid(nPos3,nPos1-nPos3);
				else if ( nPos1 > 0 && nPos2 > 0 && nPos1 > nPos2 )
					csResult = csResult + "-" + csValue.Mid(nPos3,nPos2-nPos3);
				else if ( nPos1 > 0 && nPos2 < 0 )
					csResult = csResult +  csValue.Mid(nPos3,nPos1-nPos3);
				else if ( nPos1 < 0 && nPos2 > 0 )
					csResult = csResult + "-" + csValue.Mid(nPos3,nPos2-nPos3);
				nPos1 = csValue.Find("kt",0);
				nPos2 = csValue.Find("mb",0);
				if ( nPos1 <= 0 || nPos2 <= 0 )
					continue;
				csResult = csResult + "," + csValue.Mid(nPos1+3,nPos2-nPos1-4);
                nPos2 += 3;
                nPos1 = csValue.Find(" ",nPos2);
				if ( nPos1 <= 0 )
					continue;
                csTemp = csValue.Mid(nPos2,nPos1-nPos2);
				if ( csTemp.GetLength() == 2)
                	csTemp = "0" + csTemp;
				else if ( csTemp.GetLength() == 1)
					csTemp = "0" + csTemp;
				else if ( csTemp.GetLength() > 3)
					continue;
                csResult = csResult + "," + csTemp + CONST_STRING;
				fd.WriteString(csResult); 
				//fd.WriteString(pRecord->dataList.GetAt(pRecord->dataList.FindIndex(j)));
				fd.WriteString("\n");
			}
			fd.WriteString("#1899-12-30#,0,0,0,0,0,0,0,0,0\n");
		}
	}	
	fd.Close(); 
	return TRUE;
}


⌨️ 快捷键说明

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