C++っぽくCSVから読み込む方法(エラーチェックつき)

『5.6,45,8,9』のようなカンマ区切りの4個の数字を持つCSV形式を想定。

std::string csv_string ;	// csvの一行分のデータ
double v1 ;
int v2,v3,v4 ;

// カンマの数をチェック
if( std::count( csv_string.begin() , csv_string.end() , ',' ) != 3 )
{
	return false ;
}

// 末尾の空白を取り除く
csv_string = csv_string.substr( 0 , csv_string.find_last_not_of( ' ' )+1 ) ;

// カンマを半角スペースに変換
std::replace( csv_string.begin() , csv_string.end() , ',' , ' ' ) ;	

// istringstreamを利用して読み込む
std::istringstream iss_csv( csv_string ) ;

iss_csv >> v1 >> v2 >> v3 >> v4 ;	// 読み込み

// 読み込み時のエラーチェック
if( iss_csv.fail() == true		// すべて正常に読み込めたかチェック
 || iss_csv.eof() == false )	// 文字列の最後まで処理したかチェックを行う。
{
	return false ;
}

エラーチェックが重要でなければ、istringstreamと読み込みの所だけで良いのだが、そんなわけにもいかない場合の処理。
iss_csv.fail()で正常に読み込めたかチェックする。数値文字列以外のデータがあり読み込みに失敗した場合にtrueになる。
iss_csv.eof()でデータの個数が正しいかチェックする。データ数が正しい場合はeof()がtrueになる。ただし、末尾に無駄な空白があると誤動作するので、事前に末尾の空白を除去しておく。
また、『5.6,45 8,9』のようなデータを処理する場合、istringstreamを利用するためにカンマを空白に置き換える処理があるためデータ個数チェックが誤動作する。これを防ぐために事前にカンマの数をカウントしてエラーチェックを行っておく必要がある。
データの前後、カンマの前後にいくら空白があっても処理できるのと引き換えに、空データ『5.6,,,9』や空白を含む文字列に対しては処理できないけどね。