📄 cfileload.cpp
字号:
return NULL;
}
/*!
次の論理行を文字コード変換してロードする(Unicode版)
順次アクセス専用
GetNextLineのような動作をする
@return NULL以外 1行を保持しているデータの先頭アドレスを返す
NULL データがなかった
*/
/*
const wchar_t* CFileLoad::ReadLineW(
int* pnLineLen, //!< [out] 改行コード長を含む1行のデータバイト数
CEOL* pcEol //!< [i/o]
)
{
const char *pLine;
int nRetVal = 1;
int nBufLineLen;
int nEolLen;
// 行データクリア。本当はバッファは開放したくない
m_cmemLine.SetDataSz( "" );
// 1行取り出し ReadBuf -> m_memLine
// Oct. 19, 2002 genta while条件を整理
while( NULL != ( pLine = GetNextLineCharCode( m_pReadBuf, m_nReadDataLen,
&nBufLineLen, &m_nReadBufOffSet, pcEol, &nEolLen ) ) ){
// ReadBufから1行を取得するとき、改行コードが欠ける可能性があるため
if( m_nReadDataLen <= m_nReadBufOffSet && 1 == m_nMode ){
m_cmemLine.Append( pLine, nBufLineLen );
m_nReadBufOffSet -= nEolLen;
// バッファロード File -> ReadBuf
Buffering();
}else{
m_cmemLine.Append( pLine, nBufLineLen );
break;
}
}
}
m_nReadLength += ( nBufLineLen = m_cmemLine.GetLength() );
// 文字コード変換
switch( m_CharCode ){
case CODE_SJIS:
m_cmemLine.SJISToUnicode();
// nEolLen = nEolLen * sizeof(wchar_t);
break;
case CODE_EUC:
m_cmemLine.EUCToSJIS();
m_cmemLine.SJISToUnicode();
// nEolLen = nEolLen * sizeof(wchar_t);
break;
case CODE_JIS:
// E-Mail(JIS→SJIS)コード変換
m_cmemLine.JIStoSJIS( ( m_nFlag & 1 ) == 1 );
m_cmemLine.SJISToUnicode();
// nEolLen = nEolLen * sizeof(wchar_t);
break;
case CODE_UNICODE:
break;
case CODE_UTF8:
// m_cmemLine.UTF8ToUnicode();
m_cmemLine.UTF8ToSJIS();
m_cmemLine.SJISToUnicode();
// nEolLen = nEolLen * sizeof(wchar_t);
break;
case CODE_UTF7:
// m_cmemLine.UTF7ToUnicode();
m_cmemLine.UTF7ToSJIS();
m_cmemLine.SJISToUnicode();
// nEolLen = nEolLen * sizeof(wchar_t);
break;
case CODE_UNICODEBE:
// m_cmemLine.UnicodeBEToUnicode();
m_cmemLine.SwapHLByte();
break;
}
m_nLineIndex++;
// 行数がintの範囲を超えた
// ただしファイルサイズがintの範囲内ならまずありえない
// if( m_nLineIndex < 0){
// throw CError_FileRead();
// return NULL;
// }
// データあり
if( 0 != nBufLineLen + nEolLen ){
// 改行コードを追加
m_cmemLine.Append( pcEol->GetUnicodeValue(), pcEol->GetLen() * sizeof( wchar_t ) );
return reinterpret_cast<wchar_t*>( m_cmemLine.GetPtr( pnLineLen ) );
}
// データがない => 終了
// m_cmemLine.Empty(); // protected メンバ
m_cmemLine.SetDataSz("");
return NULL;
}
*/
/*!
バッファにデータを読み込む
@note エラー時は throw する
*/
void CFileLoad::Buffering( void )
{
DWORD ReadSize;
// メモリー確保
if( NULL == m_pReadBuf ){
int nBufSize;
nBufSize = ( m_nFileSize < gm_nBufSizeDef )?( m_nFileSize ):( gm_nBufSizeDef );
// Borland C++では0バイトのmallocを獲得失敗と見なすため
// 最低1バイトは取得することで0バイトのファイルを開けるようにする
if( 0 >= nBufSize ){
nBufSize = 1; // Jun. 08, 2003 BCCのmalloc(0)がNULLを返す仕様に対処
}
m_pReadBuf = (char *)malloc( nBufSize );
if( NULL == m_pReadBuf ){
throw CError_FileRead(); // メモリー確保に失敗
}
m_nReadDataLen = 0;
m_nReadBufSize = nBufSize;
m_nReadBufOffSet = 0;
}
// ReadBuf内にデータが残っている
else if( m_nReadBufOffSet < m_nReadDataLen ){
m_nReadDataLen -= m_nReadBufOffSet;
memmove( m_pReadBuf, &m_pReadBuf[m_nReadBufOffSet], m_nReadDataLen );
m_nReadBufOffSet = 0;
}
else{
m_nReadBufOffSet = 0;
m_nReadDataLen = 0;
}
// ファイルの読み込み
ReadSize = Read( &m_pReadBuf[m_nReadDataLen], m_nReadBufSize - m_nReadDataLen );
if( 0 == ReadSize ){
m_eMode = FLMODE_READBUFEND; // ファイルなどの終わりに達したらしい
}
m_nReadDataLen += ReadSize;
}
/*!
バッファクリア
*/
void CFileLoad::ReadBufEmpty( void )
{
if ( NULL != m_pReadBuf ){
free( m_pReadBuf );
m_pReadBuf = NULL;
}
m_nReadDataLen = 0;
m_nReadBufSize = 0;
m_nReadBufOffSet = 0;
}
/*!
バッファサイズの変更
@note ファイルサイズを考慮しない
FileOpenより先に呼ぶと確実にバッファサイズを小さくできる
*/
/*
void CFileLoad::SetReadBufAlloc( int nNewSize ){
char * pBuf;
// データが残っている場合は移動させる
if( m_nReadBufOffSet + 1 <= m_nReadDataLen ){
m_nReadDataLen -= m_nReadBufOffSet;
memmove( m_pReadBuf, &m_pReadBuf[m_nReadBufOffSet], m_nReadDataLen );
m_nReadBufOffSet = 0;
}
// 現在ロードしてるデータを失わないように
if( m_nReadDataLen > nNewSize ){
nNewSize = m_nReadDataLen;
}
// wchar_t の大きさで整頓
if( 0 != nNewSize % sizeof(wchar_t) ){
nNewSize += sizeof(wchar_t) - ( nNewSize % sizeof(wchar_t) );
}
if( gm_nBufSizeMin > nNewSize ){
nNewSize = gm_nBufSizeMin;
}
// バッファサイズを変更
if( m_nReadBufSize != nNewSize ){
if( NULL != ( pBuf = (char *)realloc( m_pReadBuf, nNewSize ) ) ){
m_pReadBuf = pBuf;
m_nReadBufSize = nNewSize;
}
// メモリー確保に失敗したときは変更はなかったことにする
}
}
*/
/*!
現在の進行率を取得する
@return 0% - 100% 若干誤差が出る
*/
int CFileLoad::GetPercent( void ){
int nRet;
if( 0 == m_nFileDataLen || m_nReadLength > m_nFileDataLen ){
nRet = 100;
}else if( 0x10000 > m_nFileDataLen ){
nRet = m_nReadLength * 100 / m_nFileDataLen ;
}else{
nRet = m_nReadLength / 128 * 100 / ( m_nFileDataLen / 128 );
}
return nRet;
}
/*!
GetNextLineの汎用文字コード版
*/
const char* CFileLoad::GetNextLineCharCode(
const char* pData, //!< [in] 検索文字列
int nDataLen, //!< [in] 検索文字列のバイト数
int* pnLineLen, //!< [out] 1行のバイト数を返すただしEOLは含まない
int* pnBgn, //!< [i/o] 検索文字列のバイト単位のオフセット位置
CEOL* pcEol, //!< [i/o] EOL
int* pnEolLen //!< [out] EOLのバイト数 (Unicodeで困らないように)
){
const char *pRetStr;
switch( m_CharCode ){
case CODE_UNICODE:
*pnBgn /= sizeof( wchar_t );
pRetStr = (const char*)CFileLoad::GetNextLineW(
(const wchar_t*)pData,
nDataLen / sizeof( wchar_t ),
pnLineLen,
pnBgn,
pcEol );
*pnLineLen *= sizeof( wchar_t );
*pnBgn *= sizeof( wchar_t );
*pnEolLen = pcEol->GetLen() * sizeof( wchar_t );
break;
case CODE_UNICODEBE:
*pnBgn /= sizeof( wchar_t );
pRetStr = (const char*)CFileLoad::GetNextLineWB(
(const wchar_t*)pData,
nDataLen / sizeof( wchar_t ),
pnLineLen,
pnBgn,
pcEol );
*pnLineLen *= sizeof( wchar_t );
*pnBgn *= sizeof( wchar_t );
*pnEolLen = pcEol->GetLen() * sizeof( wchar_t );
break;
default:
pRetStr = GetNextLine( pData, nDataLen, pnLineLen, pnBgn, pcEol );
*pnEolLen = pcEol->GetLen();
break;
}
return pRetStr;
}
/*!
GetNextLineのwchar_t版
GetNextLineより作成
static メンバ関数
*/
const wchar_t* CFileLoad::GetNextLineW(
const wchar_t* pData, //!< [in] 検索文字列
int nDataLen, //!< [in] 検索文字列の文字数
int* pnLineLen, //!< [out] 1行の文字数を返すただしEOLは含まない
int* pnBgn, //!< [i/o] 検索文字列のオフセット位置
CEOL* pcEol //!< [i/o] EOL
)
{
int i;
int nBgn;
nBgn = *pnBgn;
pcEol->SetType( EOL_NONE );
if( *pnBgn >= nDataLen ){
return NULL;
}
for( i = *pnBgn; i < nDataLen; ++i ){
// 改行コードがあった
if( pData[i] == (wchar_t)0x000a || pData[i] == (wchar_t)0x000d ){
// 行終端子の種類を調べる
pcEol->SetType( CEOL::GetEOLTypeUni( &pData[i], nDataLen - i ) );
break;
}
}
*pnBgn = i + pcEol->GetLen();
*pnLineLen = i - nBgn;
return &pData[nBgn];
}
/*!
GetNextLineのwchar_t版(ビックエンディアン用)
GetNextLineより作成
static メンバ関数
*/
const wchar_t* CFileLoad::GetNextLineWB(
const wchar_t* pData, //!< [in] 検索文字列
int nDataLen, //!< [in] 検索文字列の文字数
int* pnLineLen, //!< [out] 1行の文字数を返すただしEOLは含まない
int* pnBgn, //!< [i/o] 検索文字列のオフセット位置
CEOL* pcEol //!< [i/o] EOL
)
{
int i;
int nBgn;
nBgn = *pnBgn;
pcEol->SetType( EOL_NONE );
if( *pnBgn >= nDataLen ){
return NULL;
}
for( i = *pnBgn; i < nDataLen; ++i ){
// 改行コードがあった
if( pData[i] == (wchar_t)0x0a00 || pData[i] == (wchar_t)0x0d00 ){
// 行終端子の種類を調べる
pcEol->SetType( CEOL::GetEOLTypeUniBE( &pData[i], nDataLen - i ) );
break;
}
}
*pnBgn = i + pcEol->GetLen();
*pnLineLen = i - nBgn;
return &pData[nBgn];
}
/*[EOF]*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -