
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;
}
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;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
最早開始時間と最遅完了時刻を...
-
#define _CRT_SECURE_NO_WARNIN...
-
C言語 エラーの原因がわからな...
-
C言語での引数の省略方法
-
systemの戻り値を取得する方法
-
剰余演算を論理演算と加減算に...
-
「指定されたキャストは有効で...
-
【C++】関数ポインタの使い方
-
VB.NET DLL 参照型String読込み
-
C言語の課題です
-
system関数がうまくいかない
-
構造体のすべての変数を文字列...
-
実数の整数部,小数部の取得
-
「{ } で囲むだけ」は正しい?
-
signal関数の使い方
-
反復処理
-
windows-findstrの正規表現を使...
-
C言語で分からないところがあり...
-
C言語に関する質問です フィボ...
-
異なる文字列のマッチングを、D...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
#define _CRT_SECURE_NO_WARNIN...
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
【C++】関数ポインタの使い方
-
C言語 エラーの原因がわからな...
-
複数桁10進数の*桁目だけを抽出...
-
return 1L
-
if と配列の組み合わせ
-
ラップ関数とはどんなものですか?
-
式は定数値が必要です」という...
-
数字列を3桁ごとにカンマで区切...
-
実数の整数部,小数部の取得
-
C言語でDxlibを使って3x3の奇数...
-
プログラムについて(UNIX)
-
acceptをalarmでタイムアウトさ...
-
C言語の課題です
-
エラー 添字が付けられた値が、...
-
CStringの配列要素を関数で受け...
-
最早開始時間と最遅完了時刻を...
-
入力された数字を大きい順に並...
おすすめ情報