readCsvNumbers.h
/// CSV形式のdouble1行を読み取る
/// 引用符で囲んだ文字列には対応せず
///—— 宣言
#include <iostream>
// CSV形式の数値1行を最大(nMaxItem)カラム数まで
//doubleの配列に読み込み、読み込み数を返す。
int readCsvNumbers(std::istream &is,double *pd,int nMaxItem);
readCsvNumbers.cpp
///—— 実装
int readCsvNumbers(std::istream &is,double *pd,int nMaxItem)
{
char comma;//","を読み飛ばす為
int nGet=0;
//ファイルを読み終わればEOF
if(is.eof()) return -1;
for(int iItem=0;iItem<nMaxItem;iItem++){
//数字読み込み
is>>pd[iItem];
//行末か数字以外なら終了。
if(is.fail()) break;
if(iItem<nMaxItem-1){
is>>comma;
}
if(is.fail()) break;
nGet++;
}
return nGet;
}
sample.cpp
///—— 使い方の例
/// 標準入力から読む場合。
#define nCol (10)
int main(int ac,char *av[]){
double *din=new double[nCol];
while(!std::cin.eof() && !std::cin.fail()){
//CSVデータを1行読み出し
int nR;
nR=readCsvNumbers(std::cin,din,nCol);
//読み込んだカラム数を確認
//不足で終了
if(nR!=期待した数)
break;
if(nR<0) //EOF
break;
//行毎の処理。
//for(int i=0;i<nR;i++){
//std::cout<<d[i]<<" ";
//}
//std::cout <<std::endl;
}
//
delete [] din;
return 0;
}
/// ファイルから読む場合は
std::ifstream ifs;
ifs.open(tapFile,std::ifstream::in);
として、ファイルをオープンして、
std::cinの代わりにifsを使います。