//----------------------------------------------------------------------------
// 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();
}