テキストファイルを扱うときによく使うのが文字列の分断です。
例えば、改行文字で区切れば行単位で文字列を処理するのに使えます。
MFCのCStringだとSplit関数が提供されてますが、Trim 同様 WinAPI ではありません。
STLを使って文字列を分断する
STLのstringとwstringを使ってます。
■ std::string の場合
/**
* @brief 文字列を分離して配列化する
* @param strFile 分離対象文字列
* @param moji 分離判定文字
* @return 分離した文字群
*/
std::vector<std::string> CStr::Split( std::string String, char cMoji )
{
int nStart = 0, nEnd = -1;
std::vector<std::string> vList;
std::string msLine;
do
{
if( nStart == nEnd )
{
nStart ++;
}
else if( nStart < nEnd )
{
msLine = String.substr( nStart, nEnd - nStart );
Trim( msLine );
vList.push_back( msLine );
nStart = nEnd + 1;
}
}while( ( nEnd = String.find( cMoji, nStart ) ) != std::string::npos );
// 残ったデータを保存
if( ( String.size() - nStart ) > 0 )
{
msLine = String.substr( nStart, String.size() - nStart );
vList.push_back( msLine );
}
return vList;
}
■ std::wstring の場合
/**
* @brief 文字列を分離して配列化する
* @param strFile 分離対象文字列
* @param moji 分離判定文字
* @return 分離した文字群
*/
std::vector<std::wstring> CStr::Split( std::wstring String, wchar_t cMoji )
{
int nStart = 0, nEnd = 0;
std::vector<std::wstring> vList;
std::wstring wsLine;
do
{
if( nStart < nEnd )
{
wsLine = String.substr( nStart, nEnd - nStart );
Trim( wsLine );
vList.push_back( wsLine );
nStart = nEnd + 1;
}
}while( ( nEnd = String.find( cMoji, nStart ) ) != std::string::npos );
// 残ったデータを保存
if( ( String.size() - nStart ) > 0 )
{
wsLine = String.substr( nStart, String.size() - nStart );
vList.push_back( wsLine );
}
return vList;
}
最後に残った1行を保存するのがポイントです。
戻り値で帰ってきた vector をループで回せば全データに容易にアクセスできます。
スポンサーリンク
