なまもの備忘録

気になったことをつらつらと書いていきます

(C++)大きさ不明の2次元配列データを2次元vectorに読み込む方法

3/22 17:10

大きさの分からない2次元配列データを2次元vectorに格納する方法がいくら調べても見つからなかったので、分からないなりに調べつつコードを作成してみた。
下記のコードであれば、データが数値のcsvファイルならなんでも読み込めるはず。

2017/10/20
久しぶりにコードを見返したところ、いくつか気になった点があったので修正。

修正点
 任意の数値型のvectorに対してGetdata関数が適用できるようにした。
 using namespace std;を削除した。

//大きさ不明の2次元配列データを2次元vectorに読み込むGetdata関数
//Getdata("読み込みたいcsvファイル名",格納先2次元vector)
//読み込み先の2次元vectorはあらかじめ用意しておく必要がある

#include <iostream>
#include <fstream>
#include <sstream>
#include <vector>
#include <string>

template<typename Num_type>
bool Getdata(std::string filename,std::vector<std::vector<Num_type> >& data){
    std::ifstream reading_file;
    reading_file.open(filename,std::ios::in);

    std::string reading_line_buffer;

    std::cout << "reading " << filename << "..." << std::endl;

    //1行目を空読み(適用していたデータの都合上)
    //1行目から読みたい場合は下の一行をコメントアウトする
    getline(reading_file,reading_line_buffer);

    Num_type num;
    char comma;

    while(!reading_file.eof()){
	std::vector<Num_type> temp_data;
	getline(reading_file,reading_line_buffer);
	std::istringstream is(reading_line_buffer);
	while(!is.eof()){
	    is >> num >> comma;
	    temp_data.push_back(num);
	}
	data.push_back(temp_data);
    }

    return true;
}

//動作テスト                                                                      
int main(){
    //読み込み先2次元vectorを用意する、今回の数値型はなんでも良い
    std::vector<std::vector<double> > data;

    //Getdata関数を使う
    Getdata("post_bz100.tifresult.csv",data);

    for(int j=0 ;j < data.size() ;j++){
	for(int i=0 ;i < data[j].size() ;i++){
	    std::cout << data[j][i] << " ";
	}
	std::cout << std::endl;
    }
    std::cout << std::endl;

    return 0;
}