
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で質問しましょう!
似たような質問が見つかりました
- Perl perlで2次元配列をサブルーチンに値渡しで渡す 5 2022/12/17 18:49
- C言語・C++・C# [C言語] コメント文字列を無視して、数値データを読み込むプログラム部分について 5 2022/10/05 11:03
- Microsoft ASP プログラミング関係で質問です。 3 2022/10/11 16:06
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) VBAで重複データを合算したい(時間) 1 2022/12/08 23:06
- Visual Basic(VBA) 列と行の名前(重複あり)が交差するセルに、データを入力したい 3 2022/06/12 11:17
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- Excel(エクセル) エクセル 任意の列数で分割する方法 3 2022/07/31 14:58
- Visual Basic(VBA) vbaについて 主に以下のような設定をしたいです。 Aブックの表の行数が20未満だったら Bブックの 1 2023/06/08 23:40
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数桁10進数の*桁目だけを抽出...
-
#define _CRT_SECURE_NO_WARNIN...
-
C# 除算
-
「指定されたキャストは有効で...
-
再帰呼び出し
-
数値をuchar型に入れるには???
-
C言語での引数の省略方法
-
アスタリスクでダイヤ型を作る
-
C言語 エラーの原因がわからな...
-
C言語について教えてください。
-
cプログラミングについて…
-
(int *)の意味
-
課題なんですが・・・
-
表示をクリアする方法
-
c言語の問題です
-
C言語 探索に関して
-
acceptをalarmでタイムアウトさ...
-
プログラミング
-
初項a_0=aとし、漸化式 a_n+1=(...
-
入力された数字を大きい順に並...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「指定されたキャストは有効で...
-
C言語での引数の省略方法
-
複数桁10進数の*桁目だけを抽出...
-
C言語 エラーの原因がわからな...
-
#define _CRT_SECURE_NO_WARNIN...
-
ラップ関数とはどんなものですか?
-
【C++】関数ポインタの使い方
-
実数の整数部,小数部の取得
-
int型の変数値をバイト列として...
-
std::set<int> で、ある値が何...
-
PowerShellがうまくいかない
-
(int *)の意味
-
CStringの配列要素を関数で受け...
-
ColorをRGBで指定する方法
-
「{ } で囲むだけ」は正しい?
-
acceptをalarmでタイムアウトさ...
-
if と配列の組み合わせ
-
read関数をノンブロッキングで...
-
(マルチスレッド)_beginthrea...
-
int16_t の _t は何?
おすすめ情報