テキストファイルを扱うときによく使うのが文字列の分断です。

例えば、改行文字で区切れば行単位で文字列を処理するのに使えます。

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 をループで回せば全データに容易にアクセスできます。

スポンサーリンク