?? arraydata.cpp
字號:
#include "StdAfx.h"
#include "arraydata.h"
#include "stdio.h"
#include "share.h"
CArrayData::CArrayData(void)
: m_strPathName(_T(""))
, m_pfData(NULL)
, m_nLine(-1)
, m_nRow(-1)
, m_nTotal(0)
, m_strLastError(_T("SUCCESS"))
{
}
CArrayData::CArrayData(CString strPathName)
{
m_strPathName = strPathName;
m_pfData = NULL;
m_nLine = -1;
m_nRow = -1;
m_nTotal = 0;
m_strLastError = _T("SUCCESS");
}
CArrayData::~CArrayData(void)
{
if(NULL != m_pfData)
{
delete [] m_pfData;
m_pfData = NULL;
}
}
void CArrayData::SetPara(CString strPathName)
{
m_strPathName = strPathName;
}
int CArrayData::InitArray()
{
if(m_nLine<0 || m_nRow<0)
{
m_strLastError = "行、列號必須大于零!";
return -1;
}
if(NULL != m_pfData)
{
m_strLastError.Format("Memory has allocated! Line: %d ; Row: %d !",m_nLine,m_nRow);
return -1;
}
try
{
m_pfData = new double[m_nLine * m_nRow];
for(int i=0;i<m_nLine;i++)
for(int j=0;j<m_nRow;j++)
*(m_pfData + i * m_nRow + j) = 0;
}
catch(char * str)
{
m_strLastError.Format("內存分配錯誤! 異常: %s",str);
return -1;
}
return m_nLine * m_nRow;
}
//get next value string.eg: 22 1.00
//str:the org string
//nLen:length of the org string
//nRow:row of the value
//fValue:value of the value
//nRstStrLen: length of result string
//RETURN: true,i had got the next string; false:has not next string
BOOL CArrayData::GetNextValue(char* str,int& nCurLine, int& nRow,double& fValue,int& nRstStrLen)
{
char* pStart,*pEnd;
char strTemp[26];
double value = -1;
int len = (int)strlen(str);
//check if next value exist
//if len(str) is less than 3, has not next value
if(len<=3)
return false;
pStart = str;
//get row
if(nRow<m_nRow) nRow++;
else return false;
//get value
while(!((*pStart>='0')&&(*pStart<='9')))
{ if('@' == *pStart)
return false;
else pStart++;
}
pEnd = pStart;
while(((*pEnd>='0'&&*pEnd<='9')||*pEnd=='.') && '@' != *pEnd)
pEnd++;
strncpy(strTemp,pStart,pEnd-pStart);
strTemp[pEnd-pStart] = '\0';
value = (double)atof(strTemp);
nRstStrLen = (int)(pEnd - str);
fValue = value;
return true;
}
//modify value array by line,row,value
BOOL /*float*/ CArrayData::SetValueArray(int nLine,int nRow,double fValue)
{
m_pfData[nLine*m_nRow + nRow] = fValue;
return true;
}
int CArrayData::ReadData()
{
char* strLineBuffer = new char[m_nRow*40];//假定每個屬性數據長度(包括空格)最大不超過2 0
int nCurLineLen = 0;
int nCurValueLen = 0;
int nRow = -1;
double fValue = -1;
int nCurLine=0;
float fCurValue = 0;
FILE* fp_info;
char *pStart;
fp_info=_fsopen((LPCTSTR)m_strPathName, "rb", SH_DENYNO);
if ( fp_info == NULL )
{
m_strLastError.Format("打不開文件: %s",(LPCTSTR)m_strPathName);
delete [] strLineBuffer;
return -1;
}
for(;nCurLine<m_nLine;nCurLine++)
{
if(!feof(fp_info))
{
fgets(strLineBuffer,m_nRow*40,fp_info);
nCurLineLen = (int)strlen(strLineBuffer);
strLineBuffer[nCurLineLen] = '@'; //add a @ as end of string
strLineBuffer[nCurLineLen+1] = '\0';
pStart = strLineBuffer;
while(GetNextValue(pStart,nCurLine,nRow,fValue,nCurValueLen))
{
if(!SetValueArray(nCurLine,nRow,fValue)) //set value array failed
{
fclose(fp_info);
m_strLastError = "設置數據矩陣錯誤!";
delete [] strLineBuffer;
return -1;
}
m_nTotal++;
pStart += nCurValueLen;
}
nRow=-1;
}
else
{
fclose(fp_info);
m_strLastError = "Abnormal EOF reached!";
delete [] strLineBuffer;
return -1;
}
}
fclose(fp_info);
delete [] strLineBuffer;
return m_nTotal;
}
int CArrayData::Read(int m_nDataNum, int m_nPorpNum,CString m_sFileName)
{
if(m_nDataNum<0 || m_nPorpNum<0 ||"" == m_sFileName) //failed
{
m_strLastError = "錯誤!行、列數不能小于零且必須首先輸入數據文件名!";
return -1;
}
m_nLine=m_nDataNum;
m_nRow=m_nPorpNum;
m_strPathName =m_sFileName;
if(-1 == InitArray()) //failed
return -1;
int nTotal = ReadData();
if(-1 == nTotal) //failed
return -1;
return nTotal;
}
double* CArrayData::GetData()
{
return m_pfData;
}
CString CArrayData::GetLastError(void)
{
return m_strLastError;
}
BOOL CArrayData::GetInfo(int& nLine, int& nRow,int& nTotal)
{
if(NULL == m_pfData)
{
nLine = -1;
nRow = -1;
nTotal=-1;
return false;
}
else
{
nLine = m_nLine;
nRow = m_nRow;
nTotal = m_nTotal;
return true;
}
}
void CArrayData::CleanArray(void)
{
// memset((void*)m_pfData,0,sizeof(m_pfData));
for(int i=0;i<m_nLine;i++)
for(int j=0;j<m_nRow;j++)
*(m_pfData + i * m_nRow + j) = 0;
}
double CArrayData::GetValueByXY(int nLine, int nRow)
{
if(nLine > m_nLine || nRow > m_nRow || nLine < 1 || nRow <1) //wrong para
{
m_strLastError.Format("錯誤!你給出的行、列號超過最大行!\n 最大行: %d; 最大列: %d !",m_nLine,m_nRow);
return -1;
}
return *(m_pfData + (nLine-1) * m_nRow + (nRow - 1));
}
int CArrayData::GetDataNum(void)
{
int datanum=1;
if(m_nLine>datanum) datanum=m_nLine;
return datanum;
}
int CArrayData::GetPropNum()
{
int propnum=0;
if(m_nRow>propnum) propnum=m_nRow;
return propnum;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -