• ベストアンサー

【C++】行列データの読み込み

C++でテキストファイルに以下のようにカンマ区切り(例なのでスペース等でも構いません)で記述された行列を2次元配列に格納する方法が分かりません。 例 1,2,3 4,5,6 7,8,9 よい方法があればご教授願います。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

#include <stdio.h> template< class T > class Matrix { public: explicit Matrix( int row, int col ) : _row( row ), _col( col ) { _data = new T* [ _row ]; for( int ii = 0; ii < _row; ii++ ) { _data[ ii ] = new T[ _col ]; for( int jj = 0; jj < _col; jj++ ) { _data[ ii ][ jj ] = 0; } } } virtual ~Matrix() { for( int ii = 0; ii < _row; ii++ ) { delete[] _data[ ii ]; } delete[] _data; } T data( int row, int col ) // 値参照 { return _data[ row ][ col ]; } void setData( int row, int col, T data ) // 値登録 { _data[ row ][ col ] = data; } int row(){ return _row; } // 行数 int col(){ return _col; } // 列数 private: T** _data; int _row; int _col; }; Matrix< int >* getMatrix( const char* fileName ) { FILE* stream = fopen( fileName, "r" ); if( !stream ) { return NULL; } int row = 0; int col = 0; char* ptr; // 行数と列数を取得する char buffer[ 256 ]; for( row = 0; fgets( buffer, sizeof( buffer ), stream ); row++ ) { // 行毎の列数が異なる場合、一番大きい列数を採用する int temp = 1; for( ptr = &buffer[ 0 ]; *ptr != '\0'; ptr++ ) { if( *ptr == ',' ) ++temp; } if( col < temp ) col = temp; } // 行列バッファを生成する Matrix< int >* matrix = new Matrix< int >( row, col ); // ファイルポインタを先頭に戻す fseek( stream, 0, SEEK_SET ); // ファイルの中身を行列バッファにセットする for( row = 0; row < matrix->row(); row++ ) { if( !fgets( buffer, sizeof( buffer ), stream ) ) { break; } ptr = strtok( buffer, "," ); for( col = 0; col < matrix->col(); col++ ) { matrix->setData( row, col, atoi( ptr ) ); if( !( ptr = strtok( NULL, "," ) ) ) { break; } } } fclose( stream ); return matrix; } int main(int argc, char* argv[]) { if( 2 != argc ) { return -1; } // ファイルから読み込み Matrix< int >* matrix = getMatrix( argv[ 1 ] ); if( !matrix ) { return -1; } // 読み取った数値を表示 for( int row = 0; row < matrix->row(); row++ ) { for( int col = 0; col < matrix->col(); col++ ) { printf( "%d,", matrix->data( row, col ) ); } printf( "\n" ); } delete matrix; return 0; }

noname#135803
質問者

お礼

ありがとうございます

その他の回答 (2)

回答No.2

”配列”ではないけれど… #include <vector> #include <stdio.h> using namespace std; int loadFile( const char* fileName, vector< vector<int> >& vParams ) { //ファイルを開く FILE* stream = fopen( fileName, "r" ); if( !stream ) { return -1; } //ファイルを読み込む char buffer[ 256 ]; while( fgets( buffer, sizeof( buffer ), stream ) ) { vector<int> temp; //CSV形式の数値を読み込む char* ptr = strtok( buffer, "," ); while( ptr ) { temp.push_back( atoi( ptr ) ); ptr = strtok( NULL, "," ); } vParams.push_back( temp ); } fclose( stream ); return 0; } int main(int argc, char* argv[]) { //コマンドライン引数:○○○.exe filename if( 2 != argc ) { return -1; } vector< vector<int> > vParams; //ファイルから読み込み if( 0 != loadFile( argv[ 1 ], vParams ) ) { return -1; } //読み取った数値を表示 for( vector< vector<int> >::iterator irow = vParams.begin(); irow != vParams.end(); irow++ ) { for( vector<int>::iterator icol = irow->begin(); icol != irow->end(); icol++ ) { printf( "%d,", *icol ); } printf( "\n" ); } return 0; }

noname#135803
質問者

お礼

ありがとうございます

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.1

3行3列で固定ですか?

noname#135803
質問者

補足

すみません説明不足でした。 行列は変動し、m × nです。

関連するQ&A

専門家に質問してみよう