Move git root from Client/ to src/ to track all source code: - Client: Game client source (moved to Client/Client/) - Server: Game server source - GameTools: Development tools - CryptoSource: Encryption utilities - database: Database scripts - Script: Game scripts - rylCoder_16.02.2008_src: Legacy coder tools - GMFont, Game: Additional resources 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
328 lines
7.1 KiB
C++
328 lines
7.1 KiB
C++
#ifdef _BASE_LIBRARY_
|
|
#include "../stdafx.h"
|
|
#endif
|
|
|
|
#include "DelimitedFile.h"
|
|
|
|
// TODO: CDelimitedFile::Write 계열 제작
|
|
|
|
CDelimitedFile::CDelimitedFile(const char* pszDelimiter)
|
|
: m_fpFile( NULL ), m_dwColumn( 0 ), m_dwColumnCount( 0 )
|
|
{
|
|
strncpy(m_szDelimiter, pszDelimiter, MAX_DELIMITER_NUM);
|
|
}
|
|
|
|
CDelimitedFile::~CDelimitedFile()
|
|
{
|
|
Close();
|
|
}
|
|
|
|
BOOL CDelimitedFile::Open( LPCSTR szFilename, int nHeadLine, UINT nOpenFlags )
|
|
{
|
|
m_fpFile = ::fopen( szFilename, (nOpenFlags & modeCreate) ? "wt" : "rt" );
|
|
if (NULL == m_fpFile)
|
|
{
|
|
#ifdef _BASE_LIBRARY_
|
|
g_Log.ErrLog(__FUNCTION__, __FILE__, __LINE__, "파일 %s를 열 수 없습니다.", szFilename);
|
|
#endif
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
if (nHeadLine > -1) {
|
|
for (int i=0; i<nHeadLine; ++i) {
|
|
ReadLine();
|
|
}
|
|
|
|
CHAR szColumnName[256];
|
|
for( m_dwColumnCount = 0; ReadString( szColumnName, 255 ); m_dwColumnCount++ ) {
|
|
// TODO: szColumnName을 리스트에 추가
|
|
m_ColumnNames.push_back(szColumnName);
|
|
}
|
|
}
|
|
return TRUE;
|
|
}
|
|
|
|
void CDelimitedFile::Close( void )
|
|
{
|
|
if( m_fpFile ) {
|
|
::fclose( m_fpFile );
|
|
m_fpFile = NULL;
|
|
}
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadLine( void )
|
|
{
|
|
while( ::fgets( m_szLine, MAX_LINE_LENGTH, m_fpFile ) ) {
|
|
if( (m_szLine[0]) && (m_szLine[0] != ';') ) {
|
|
m_dwColumn = 0;
|
|
memcpy(m_szBackupLine, m_szLine, MAX_LINE_LENGTH);
|
|
return TRUE;
|
|
}
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( double &dNumber )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
dNumber = atof( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( float &fNumber )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
fNumber = (float) atof( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( unsigned long &fNumber )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
fNumber = (unsigned long) atol( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( int &iNumber )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
iNumber = atoi( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( unsigned short &iNumber )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
iNumber = (unsigned short)atoi( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( short &iNumber )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
iNumber = (short)atoi( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( unsigned char &iNumber )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
iNumber = (unsigned char)atoi( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( char &iNumber )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
iNumber = (char)atoi( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( __int64 &i64Number )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
i64Number = _atoi64( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData( DWORD64 &i64Number )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
i64Number = (DWORD)_atoi64( pszData );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadString( char *szString, DWORD dwSize )
|
|
{
|
|
CHAR *pszData = ::strtok( (m_dwColumn++) ? NULL : m_szLine, m_szDelimiter );
|
|
|
|
if( !pszData || !(*pszData) )
|
|
return FALSE;
|
|
strncpy( szString, pszData, dwSize );
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, double &dNumber )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( dNumber );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, float &fNumber )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( fNumber );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, unsigned long &fNumber )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( fNumber );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, int &iNumber )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( iNumber );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, unsigned short &iNumber )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( iNumber );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, short &iNumber )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( iNumber );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, unsigned char &iNumber )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( iNumber );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, char &iNumber )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( iNumber );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, __int64 &i64Number )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( i64Number );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadData(const char *szField, DWORD64 &i64Number )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadData( i64Number );
|
|
}
|
|
|
|
BOOL CDelimitedFile::ReadString(const char *szField, char *szString, DWORD dwSize )
|
|
{
|
|
int nSearch;
|
|
|
|
if( ((nSearch = FindColumn( szField )) == -1) )
|
|
return FALSE;
|
|
GotoColumn( nSearch );
|
|
return ReadString( szString, dwSize );
|
|
}
|
|
|
|
BOOL CDelimitedFile::GotoColumn( int nColumn )
|
|
{
|
|
CHAR* pszPos = 0;
|
|
|
|
if(nColumn < 0 || (DWORD)nColumn > m_dwColumnCount)
|
|
return FALSE;
|
|
|
|
if( (m_dwColumn == (DWORD) nColumn) )
|
|
return TRUE;
|
|
|
|
if( nColumn == 0 ) {
|
|
m_dwColumn = 0;
|
|
strtok(m_szLine, m_szDelimiter);
|
|
}
|
|
else {
|
|
for(;m_dwColumn < m_dwColumnCount && nColumn != m_dwColumn; ++m_dwColumn )
|
|
pszPos = strtok(0, m_szDelimiter);
|
|
|
|
if(m_dwColumn == m_dwColumnCount) {
|
|
memcpy(m_szLine, m_szBackupLine, MAX_LINE_LENGTH);
|
|
pszPos = strtok(m_szLine, m_szDelimiter);
|
|
for(m_dwColumn = 1; m_dwColumn < (DWORD)nColumn && nColumn != m_dwColumn; ++m_dwColumn )
|
|
pszPos = strtok(NULL, m_szDelimiter );
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
int CDelimitedFile::FindColumn(const char *szField )
|
|
{
|
|
// list에서 찾기
|
|
const std::basic_string<char>::size_type npos = -1;
|
|
|
|
for(std::basic_string<char>::size_type nCount = 0; nCount < m_ColumnNames.size(); ++nCount) {
|
|
if(npos != m_ColumnNames[nCount].find(szField)) {
|
|
return (int)nCount;
|
|
}
|
|
}
|
|
|
|
return npos;
|
|
}
|