テキストファイルを扱うときによく使うのが文字列の分断です。
例えば、改行文字で区切れば行単位で文字列を処理するのに使えます。
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 をループで回せば全データに容易にアクセスできます。
スポンサーリンク