2009年12月17日 星期四

Explode File to String List

// Explode File to String List

OpenFile(LPCTSTR szFileName)
{
    CuStringList StrList;
    StrList.OpenFile(szFileName);

    string strTemp;
    for( int i = 0 ; i < StrList.size() ; i++ )
    {
        strTemp = StrList.at(i);
    }
}

// CuStringList.h

class CuStringList
{

    vector<string> m_vecString;
public:
    CuStringList(void);
public:
    ~CuStringList(void);
public:
    
    int OpenFile( LPCTSTR szFileName );

    int size(void){ return m_vecString.size(); }
    string at(int n){ return m_vecString.at(n); }

private:
    void ExplodeFile( BYTE * pBuffer, UINT nBufferSize );

};

// CuStringList.cpp

CuStringList::CuStringList(void)
{
}

CuStringList::~CuStringList(void)
{
}

void CuStringList::ExplodeFile( BYTE * pBuffer , UINT nBufferSize)
{

    int nResult;
    char szTempBuffer[1024] = {0};
    int nszTempIndex = 0;

    for( int i = 0 ; i < nBufferSize ; i++ )
    {
        nResult = pBuffer[i];
        if( nResult != 13 && nResult != 10 )
        {
            szTempBuffer[nszTempIndex++] = nResult;
            continue;
        }

        szTempBuffer[nszTempIndex] = '\0';
        m_vecString.push_back(szTempBuffer);
        nszTempIndex = 0;

    }
}

int CuStringList::OpenFile(LPCTSTR szFileName)
{

    CuFile f;
    BOOL bResult = f.Open(szFileName, TEXT("r"));
    Assert(bResult != 0, const_cast<LPTSTR>(szFileName));

    // GetFileSize 太大的話 應該會配不出記憶體
    BYTE *pBuffer = new BYTE[ f.GetFileSize() + 2];
    Assert(pBuffer != 0, TEXT("not enough memory CuStringList::OpenFile"));

    f.Read((void*)pBuffer,  f.GetFileSize());
    ExplodeFile(pBuffer, f.GetFileSize() );

    delete [] pBuffer;
    return TRUE;
}


1 則留言:

  1. 這裡採用buffer來一次性的存放檔案,看起來效能比較快,但實際上如果檔案太大,記憶體是配不出來的,看來應該要改為一次讀一個BYTE.

    回覆刪除