Windowsコード集 上のページ

#0018 簡易テキストファイル操作クラス

#0006のCFileを使って、テキストファイルを読むようにしたクラスです。
出力周りが手抜きクサイですが、これでも十分に実用に耐えうる出来です。

//----------------------------------------------------------------------------
// ctfile.h
//----------------------------------------------------------------------------

typedef enum{CTA_NO,CTA_CREATE,CTA_READ}CTFILE_ACCESSMODE;

class CTFile{
protected:
    CTFILE_ACCESSMODE m_mode;
    CFile m_file;
    CMalloc m_buf;
    DWORD m_bufsize,m_readsize,m_ptr;
    BOOL m_end;
public:
    CTFile(LPSTR filename,CTFILE_ACCESSMODE mode = CTA_READ,DWORD bufsize = 1024){
           Open(filename,mode,bufsize);}
    CTFile(){m_mode = CTA_NO;}
    BOOL Open(){return m_file.Open();}
    BOOL Open(LPSTR filename,CTFILE_ACCESSMODE mode = CTA_READ,DWORD bufsize = 1024);
    BOOL Create(LPSTR filename,DWORD bufsize = 1024){return Open(filename,CTA_CREATE,bufsize);}
    void Close(){m_file.Close();}
    BOOL Read(LPSTR buf,DWORD size);
    BOOL Write(LPSTR buf);
};


//----------------------------------------------------------------------------
// ctfile.cpp
//----------------------------------------------------------------------------

BOOL CTFile::Open(LPSTR filename,CTFILE_ACCESSMODE mode,DWORD bufsize)
{
    CFILE_ATTRIBUTE a;
    switch(mode){
    case CTA_CREATE:a = CA_CREATE;break;
    case CTA_READ:  a = CA_ACCESS;break;
    default:        return FALSE;
    }
    if(!m_file.Open(filename,a)){return FALSE;}
    if((m_mode = mode) == CTA_READ){
        m_buf.Alloc(m_bufsize = bufsize);
        m_readsize = m_ptr = 0;
        m_end = FALSE;
    }
    return TRUE;
}

BOOL CTFile::Read(LPSTR buf,DWORD size)
{
    if(m_end)return FALSE;

    if(m_readsize <= m_ptr){
        m_ptr = 0;
        m_readsize = m_file.Read(m_buf.GetAddress(),m_bufsize);
        if(m_readsize <= 0)return FALSE;
    }

    LPSTR rbuf = (LPSTR)m_buf.GetAddress();
    CHAR c;
    size--;
    while(size > 0){
        c = rbuf[m_ptr];
        if(c == '\0' || c == '\x1a'){
            m_readsize = m_ptr = 0;
            *buf = '\0';
            m_end = TRUE;
            return TRUE;
        }
        if(c == '\x0d'){
            *buf = '\0';
            m_ptr++;
            if(rbuf[m_ptr] == '\x0a')m_ptr++;
            return TRUE;
        }
        *buf = c;
        buf++;
        size--;
    }
    *buf = '\0';
    return TRUE;
}

BOOL CTFile::Write(LPSTR buf)
{
    m_file.Write(buf,lstrlen(buf));
    return TRUE;
}


//
// 簡単なテキストアクセス
//
LPSTR line[1000];     // 格納先
CTFile f;
if(f.Open("input.txt",CTA_READ)){
    // 1行のテキストを読む
    while(f.Read(line,sizeof(line)){
        //
        // 処理ルーチン
        //
    }
    f.Close();
}




上のページ