• ベストアンサー

【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% (2126/6286)
回答No.1

3行3列で固定ですか?

noname#135803
質問者

補足

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C#です。データの出力について

    C#です。 二次元配列に格納したデータをメモ帳に出力したいのですが、どうすればいいですか? 二次元なので、それぞれをカンマで区切って出力したいのですが、やり方がわかりません。教えて下さい(><) 例)りんご,1   トマト,2   バナナ,3   みかん,4 などの二次元配列をこのように、カンマで区切った状態で出力したいんです。できれば具体的にプログラムを教えていただけると嬉しいです。

  • textareaに入力されたデータを読み込む

    例えば以下のようにtextarea内にデータが入力されているとします(カンマ区切り,スペース区切り,タブ区切りなどはなんでも良いのですが)。 +---ここから---+ 1 2 3 4 5 6 7 8 9 10 11 12 +---ここまで---+ これらのデータを配列に格納する方法が,だいぶネットサーフィンしていたのですが分かりません。 以降,Perlになってしまうのですが,1行ずつ配列にdat=(1,2,3,4)のように格納していくか,あるいは行列(2次配列)の形で格納したいのです。 $pathname="D://datafile.dat"; open MYFILE, "$pathname"; while (<MYFILE>) { chomp; @{"dat$."} = split /,/; } close MYFILE; +----------- $pathname="D://datafile.dat"; open MYFILE, "$pathname"; @dat = map {chomp;[split /,/]} <MYFILE>; close MYFILE;

  • テキストデータの読み込みについて

    C言語のテキストデータの読み込みについてです。 C言語のプログラムについてです。 2444,1114,2807, 1984,2845,2086, 658.1,-1564.0,1239.7, -102.0,958.4,123.1, 12.7,6.0,82.7 2439,1110,2802, 1973,2865,2108, 658.8,-1563.7,1239.6, -102.0,957.1,121.9, 12.8,6.0,82.7 2441,1106,2806, 1967,2888,2124, 659.4,-1563.5,1239.5, -102.2,956.4,121.0, 12.8,6.1,82.8 2440,1109,2808, 1964,2896,2127, 660.0,-1563.3,1239.4, -102.7,956.2,120.7, 12.8,6.1,82.8 2441,1112,2807, 1981,2894,2120, 660.6,-1563.0,1239.4, -103.3,956.2,120.1, 12.8,6.1,82.8                                       ↑ 上の様なカンマとスペースで15個に区切られているtxtファイルがあるのですが、このtxtデータの10コ目と11コ目をを計算で使いたく、取り出したいと考えているのですがscanfを使いどのように取り出すことが出来るのか、また取り出したデータから数値を引くことを教えて頂きたいです。 つまり -102.0   958.4 -102.0   957.1 -102.2 と 956.4 -102.7   956.2 -103.3   956.2,             を取り出して計算に使いたいです。 そして1番上の数値だと、 -102.0と958.4 を読み込み、例えばそれぞれ100を引いた値を配列に入れたいです。 -102.0と958.4 → -202.0 と 858.4 のように取り出したいです。 教えて頂きたいです。お願いします。

  • 配列の読み込み

    タブ又はカンマ、又はスペースで区切られた配列が書かれたテキストを、配列として読み込みたいのですが、どのようプログラムしたらいいのでしょうか。 つまりは、下の例みたいに書かれたテキストを、そのまま3行4列の配列として読み込みたいのです。 例) 1222,2337,593,3488 2338,384,34,2229 534,23333,234,444 ちなみに、私は下のような1列で書かれたものなら読み込めます。 例) 123 343 23 253

  • Cで二次元配列の読み込み

    はじめまして。 hiraです。 今非常に基本的であろうことに悩んでいます。まだまだプログラムを始めたところなのでうまくいきません。 内容は・・・ あるファイルを読み込んで、二次元の配列に格納していく。 です。 具体的には test.txtというファイルがあり、中身は数字の二次元配列です。 カンマやtabで区切られています。配列の大きさ、数字の桁数などはファイルによって違います。 そのファイルを読み込んで、配列に格納したいと考えています。 今は一列を読み込むことには成功しています。そこからどのようにして分けて言ったらいいのか・・・ご教示お願いします。 もしくは、もっと違う方法で読み込む方法があればよろしくお願いします。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char array[256]; char buf[256]; fin=fopen("test.txt","r"); if(fin == NULL){ printf("%sがオープンできません\n",fin); exit(1); } while(fgets(buf,256,fin) != NULL) {           ここが問題・・・ } fclose(fin); return 0; }

  • C#で、ファイルのデータを取得し、配列に格納

    C#を始めたばかりで分からないことも多いため、質問させていただきます。 C#で、テキストファイルにある2進数の数値 例: 00111100 11111100 00010100 のような8桁のデータをC#でテキストファイルから2進数のまま読み取り、 配列に格納したいです。 上の例で考えると、 byte[0]に 00111100 byte[1]に 11111100 byte[2]に 00010100  のデータが入力されているような感じです。 ArrayListを使用する方法や、 バイナリファイルで読み込む方法などもあると思うのですが、 データを1行ごとに配列に入力し、 それを見た目どおり2進数として格納する方法が分かりません。 やはり、文字コードなどを参考に、 1文字ずつ格納し、引き算していくしか方法はないのでしょうか? 文章が分かりにくくて申し訳ないのですが、回答いただけるとありがたいです! よろしくお願いいたします。

  • C言語 文字列格納

    テキストファイルから整数データ又は文字列を読み込んで配列に格納する動作についての質問です。 テキストファイルが1行区切りの整数型なら1次元配列で for(i = 0; i < maxSize; i++) { fscanf(fp,"%d", &data[i]); } テキストファイルが1行区切りの文字列なら2次元配列で for(i = 0; i < MAXSIZE; i++) { if (fscanf(fp,"%s", &data[i][300]) == EOF) break; } for(j = 0; j < i; j++) printf("%s\n", data[j]); みたいな具合に格納できたんですが、 テキストファイルが1行区切りのデータではなく、空白文字区切りの文字データだった場合、それぞれどのようにして配列に格納すればいいかがわかりません。 イメージとしては、1文字目から見ていって空白が出ればそこで切って格納していくというかんじなのですが・・・ 質問の内容がわかりにくいかもしれませんが、是非教えてください。お願いします。

  • C言語で行列の演算するには?

    C言語で行列を取り扱うにはどうしたらいいのですか? 二次元配列というのは行列の演算のことなのですか? 初心者なのでよく分からないのでなるべく丁寧に教えてもらえるとうれしいのですが。よろしくお願いします。

  • コマンドラインから配列データ入力方法

    c++でコマンドラインから2次元配列データを入力する方法を教えてください。 1次元だとスペース区切りで出来ます。 2次元はどういう記号をどう使えば区切りを入力できますか?

  • c言語 配列 や ソート datファイル読み込みについて

    初投稿でC言語初心者なのでよろしくお願いします。 課題でdatファイルから100万個の数字を読み込んで、ソートのタイムを競うのがでました。 ソートのアルゴリズム等は分かるのですが、100万個の数字を読み込むのがわかりません。 datファイルには、縦にずらっと数字が並べられていてどこを区切り文字としてとりだすのとか。 int配列も100万個も格納できないので3次元配列つかうのかなと思ってみたりしてます。 どうやって格納すればソートで使いやすいかご教授お願いいたします。

このQ&Aのポイント
  • 医療保険加入時の告知事項について知りたいです。
  • 過去1年間の診療歴が告知義務に含まれるのか疑問です。
  • うつ病の診療歴を保険会社に告知すべきか迷っています。
回答を見る

専門家に質問してみよう