/* ファイルの読み込み操作用関数群 */ #ifndef __LOADFILE_H #define __LOADFILE_H #include #include #include #include using namespace std; /* perl でいうところの split() っぽい関数のC++版実装 */ int split(string delimiter, string source, vector &storage) { storage.clear(); string::iterator delim_It, srcIt; string word = ""; int wordnum=0; for( srcIt=source.begin(); srcIt!=source.end(); srcIt++){ int flg_delim=0; // 複数のデリミタについて走査,デリミタがあったらフラグを立てる for( delim_It=delimiter.begin(); delim_It!=delimiter.end(); delim_It++ ) if( (*srcIt)==(*delim_It) ) flg_delim=1; // デリミタフラグが立っているなら単語として格納 if( flg_delim!=1 ) word.push_back(*srcIt); else if( !(word.empty()) ){ storage.push_back(word); wordnum++; word=""; } } // 入力行末がデリミタまたはwordが空なら関数を抜ける for( delim_It=delimiter.begin(); delim_It!=delimiter.end(); delim_It++ ) if( (*(source.end()-1)==(*delim_It))||(word.empty()) ) return(wordnum); storage.push_back(word); wordnum++; return(wordnum); } /* split()をつかってテーブル形式のデータファイルから二次元ベクタに格納. */ int LoadData(string delimiter, string filename, vector< vector > &output_vector) { string str; ifstream infile; vector lines; vector::iterator linesIt; vector tmpline; vector::iterator tmplineIt; vector tmpline_to_double; lines.clear(); output_vector.clear(); // ファイルを読み込んでstring型ベクタに格納する infile.open(filename.c_str(),ios::in); if(!infile){ cout << "Can't open file:["<10000){ // データ行が大き過ぎる(想定外)ならエラー終了 cout<<" FAIL:terminater [!] doesnt exist."< > tmpvect; // テーブル形式のデータファイルから二次元に格納 LoadData(delimiter, filename, tmpvect); // arr[i][j]について最大のjを取得する(動的に配列を確保する時のオーバーフロー防止) // 計算領域を矩形として扱うためにすべてのjを揃える size_i = tmpvect.size(); for(int i=0; i >::iterator i_It; vector::iterator j_It; int i=0; for( i_It=tmpvect.begin(); i_It!=tmpvect.end(); i_It++ ){ int j=0; for( j_It=(*i_It).begin(); j_It!=(*i_It).end(); j_It++){ storage[i][j]=(*j_It); j++; } i++; } } return(1); } #endif