LoginSignup
1
1

More than 5 years have passed since last update.

CSVファイルの読み込み

Posted at
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を使います。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1