?? grwtest.cpp
字號:
#include "GRWTest.h"
#include "qmessagebox.h"
#include "qfile.h"
#include "qregexp.h"
#include "GFieldData.h"
#define CHS(x) QString::fromLocal8Bit(x)
#define MAX_CNT 20
#define MAX_LINE_LEN 4096
GRWTest::GRWTest(QWidget* parent, const char* name)
:QTable(parent)
{
init();
}
GRWTest::~GRWTest()
{
}
void GRWTest::init()
{
QHeader * th = horizontalHeader();
setNumRows(MAX_CNT);
setLeftMargin(0);
//th->setLabel(0,CHS("序號"));
//th->setLabel(1,CHS("屬性值"));
//setColumnWidth(0,60);
//setColumnWidth(1,150);
m_qFile = QString("test.conf");
m_qSection = QString("testsection");
if(!readConfIni())
QMessageBox::information(this,CHS("提示"),CHS("讀取文件失敗!"),CHS("確定"));
else{
setNumCols( m_childList.count() );
QValueList<GFieldData*>::iterator it;
it = m_childList.begin();
for ( int i = 0 ; it != m_childList.end() ; ++it, ++i ) {
th->setLabel(i,CHS((*it)->m_qsFieldQmName));
}
}
//QTableItem * item = new QTableItem(this);
//item->alignment(AlignVCenter);
}
bool GRWTest::readConfIni()
{
bool bFlag = false;
QFile qFile(m_qFile);
bFlag = qFile.open(IO_ReadOnly);
if ( !bFlag )
return false;
long lBeginPos = 0;
long lEndPos = 0;
long lsize = qFile.size();
int data_len = 0;
QStringList qsList;
QString qsLine;
QString qsTemp;
while ( ! qFile.atEnd() )
{
qFile.readLine(qsLine,MAX_LINE_LEN);
if ( -1 != qsLine.find(QRegExp("^(\\s+)?\\[" + m_qSection + "\\]" )) )
{
lBeginPos = qFile.at();
while ( ! qFile.atEnd() )
{
qsLine = QString::null;
lEndPos = qFile.at();
qFile.readLine(qsLine,MAX_LINE_LEN);
if ( -1 != qsLine.find(QRegExp("^\\s+$")) ) //空白行
continue;
if ( -1 != qsLine.find(QRegExp("^(\\s+)?\\[" )))
break;
if ( -1 == qsLine.find(QRegExp("^(\\s+)?define" ) ) ) {
//真實的數據
//analyzeFieldDataStr(pFieldDataList,qsLine);
} else {
//if (-1 != qsLine.find(QRegExp("^(\\s+)?(#|;|//)")) ) { //注釋行
qsTemp = qsLine.replace(QRegExp("(\\s+)?$(\\s+)?"),"");
qsTemp += "\n";
qsList.append(qsTemp);
data_len += qsTemp.length();
// continue;
}
}
}
}
qFile.close();
int iCount=0;
char * p_chTemp[100];
for ( QStringList::Iterator it = qsList.begin(); it != qsList.end(); ++it,++iCount) {
p_chTemp[iCount] = (char*)(*it).ascii();
}
QString strTemp;
for (int k = 0 ; k < iCount ; k++)
{
strTemp = QString(p_chTemp[k]);
strTemp = strTemp.replace(QRegExp("^(\\s+)?define:(\\s+)?"),""); //去頭
strTemp = strTemp.replace(QRegExp("(\\s+)?,(\\s+)?"),","); //去掉所有的逗號前后的space
strTemp = strTemp.replace(QRegExp("\\s+$"),","); //去尾,去掉最后的space
//strTemp = strTemp.replace(QRegExp(" "),"");//一次去掉所有空格
QStringList qsListC = QStringList::split( ",", strTemp,true );
GFieldData* pFieldData = new GFieldData();
if ( NULL == pFieldData )
return bFlag;
QString qsTemp;
int offset = 0;
qsTemp = qsListC[offset++];
if ( 0 == qsTemp.find("$") ) {
pFieldData->m_iObjType = 1;
pFieldData->m_qsFieldName = qsTemp.replace("$","");
} else {
pFieldData->m_iObjType = 0;
pFieldData->m_qsFieldName = qsTemp;
}
pFieldData->m_qsFieldQmName = qsListC[offset++];
pFieldData->m_iColumnWidth = qsListC[offset++].toInt();
pFieldData->m_bReal = qsListC[offset++].toInt();
pFieldData->m_bEditable = qsListC[offset++].toInt();
pFieldData->m_iVisable_p = qsListC[offset++].toInt();
pFieldData->m_iVisable_l = qsListC[offset++].toInt();
pFieldData->m_iValueType = qsListC[offset++].toInt();
pFieldData->m_qsFieldDescription = qsListC[offset++];
m_childList.append(pFieldData);
}
return true;
}
bool GRWTest::writeConfIni()
{
bool bFlag = false;
QFile qFile(m_qFile);
bFlag = qFile.open(IO_ReadOnly);
if ( !bFlag )
return false;
long lBeginPos = 0;
long lEndPos = 0;
long lsize = qFile.size();
int data_len = 0;
QStringList qsList;
QString qsLine;
QString qsTemp;
while ( ! qFile.atEnd() )
{
qFile.readLine(qsLine,MAX_LINE_LEN);
//lCurPos = qFile.at();
if ( -1 != qsLine.find(QRegExp("^(\\s+)?\\[" + m_qSection + "\\]" )) )
{
lBeginPos = qFile.at();
while ( ! qFile.atEnd() )
{
qsLine = QString::null;
lEndPos = qFile.at();
qFile.readLine(qsLine,MAX_LINE_LEN);
if ( -1 != qsLine.find(QRegExp("^\\s+$")) ) //空白行
continue;
if ( -1 != qsLine.find(QRegExp("^(\\s+)?\\[" )))
break;
if ( -1 != qsLine.find(QRegExp("^(\\s+)?define" ) ) ) {
//真實的數據
//analyzeFieldDataStr(pFieldDataList,qsLine);
} else {
//if (-1 != qsLine.find(QRegExp("^(\\s+)?(#|;|//)")) ) { //注釋行
qsTemp = qsLine.replace(QRegExp("(\\s+)?$(\\s+)?"),"");
qsTemp += "\n";
qsList.append(qsTemp);
data_len += qsTemp.length();
// continue;
}
}
}
}
qFile.close();
GFieldData* pFieldData = NULL;
unsigned int i;
QValueList<GFieldData*>::iterator it = m_childList.begin();
for ( ; it != m_childList.end(); it++ )
{
pFieldData = (*it);
if ( pFieldData != NULL ) {
qsTemp.sprintf("define: %-26s%-20s%4d,%4d,%5d,%4d,%3d,%3d, %-5s%s\n",
(pFieldData->m_iObjType == 0) ?
(const char *)(QString(pFieldData->m_qsFieldName + ",").utf8()) :
(const char *)(QString("$" + pFieldData->m_qsFieldName + ",").utf8()),
(const char *)(QString(pFieldData->m_qsFieldQmName + ",").utf8()),
pFieldData->m_iColumnWidth,
pFieldData->m_bReal,
pFieldData->m_bEditable,
pFieldData->m_iVisable_p,
pFieldData->m_iVisable_l,
pFieldData->m_iValueType,
(const char *)(QString(pFieldData->m_qsFieldDescription + ",").utf8()),
(const char *)(pFieldData->m_qsRawFormat.utf8())
);
qsList.append(qsTemp);
data_len += qsTemp.length();
}
}
qsTemp = "\n";
qsList.append(qsTemp);
data_len += qsTemp.length();
data_len += lsize - lEndPos;
char * pData = new char[data_len + 256];
if ( pData == NULL )
return false;
memset(pData,0,data_len + 256);
char * p = pData;
for ( i = 0; i < qsList.count(); i++ )
{
qsTemp = qsList[i];
memcpy(p,qsTemp.latin1(),qsTemp.length());
p += qsTemp.length();
}
FILE* pFile = fopen(m_qFile, "r+w");
if ( !pFile )
return false;
fseek(pFile, lEndPos, SEEK_SET);
fread(p, sizeof(char), lsize - lEndPos, pFile);
fseek(pFile, lBeginPos, SEEK_SET);
fwrite(pData,sizeof(char),strlen(pData),pFile);
fclose(pFile);
delete [] pData;
return true;
}
//從指定文件中讀取一行
int GRWTest::ReadLineFromFile(FILE* IniFile, char* lpszLineBuf, int iLen)
{
int iPos;
/*-----------------------------------------------------------------------------
注意:如果文件以t即text方式打開,則回車換行兩個字符在input時被當作一個字符處理,
因此fgets()得到的一行字符串尾部只有一個換行符而沒有回車符,而如果是binary
方式打開則一行字符尾部同時有回車換行兩個字符,打開方式的不同直接影響fgets
讀入一行后刪除行尾部控制字符的操作,如果是text方式,只要刪除換行符號即可,
如果是binary方式,則要刪掉兩個控制字符。以下對兩個控制字符是否存在都進行
判斷,可以同時適應text和binary兩種模式,也就能同時適應Windows下和Unix兩種
不同格式的文本文件(unix文本文件行末只有一個換行符,即0A,沒有回車符)
后續記錄: fopen()中打開模式里的"t"是微軟自己定義的,Ansi C 只支持 "b"模式
----------------------------------------------------------------------------*/
if(fgets(lpszLineBuf, iLen, IniFile) != NULL) //fgets()函數遇到第一個換行符(0x0A)后結束(包括換行符),然后在尾部追加一個NULL后返回,因此換行符總是倒數第二個字符
{
iPos = strlen(lpszLineBuf) - 1;
if( lpszLineBuf[iPos-1] == 0x0D ) lpszLineBuf[iPos-1] = 0; //刪除尾部可能存在的回車符(0x0D)
if( lpszLineBuf[iPos] == 0x0A ) lpszLineBuf[iPos] = 0; //刪除尾部可能存在的換行符(0x0A)
}
else
return -1;
return 0; //0表示正確
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -