プロが教える店舗&オフィスのセキュリティ対策術

C++でテキストファイルに以下のようにカンマ区切り(例なのでスペース等でも構いません)で記述された行列を2次元配列に格納する方法が分かりません。


1,2,3
4,5,6
7,8,9

よい方法があればご教授願います。

A 回答 (3件)

3行3列で固定ですか?

この回答への補足

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

補足日時:2011/06/28 00:48
    • good
    • 0

”配列”ではないけれど…



#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;
}
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2011/06/28 19:06

#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;
}
    • good
    • 0
この回答へのお礼

ありがとうございます

お礼日時:2011/06/28 19:06

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!