• ベストアンサー

行列のファイル入力の仕方

タイトルのとおりCで行列をファイルから入力する方法がわからず困っています。 わかる方いらっしゃったらお願いいたします。

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

  • ベストアンサー
  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.2

3行8列の0/1のみ、という前提の例示です。 エラーチェックはしてないので適当に入れてください。 -- #define ROWS 3 #define COLUMNS 8 FILE *fp; char matrix[ROWS][COLUMNS]; int i, j; fp = fopen(ファイル名, "r"); for(i = 0; i < ROWS; i ++) { fscanf(fp, "%s\n", matrix[i]); for(j = 0; j < COLUMNS; j ++) { matrix[i][j] -= '0'; } } fclose(fp); -- 「行列要素は全部一桁」が前提なので二桁以上の場合はやり方を変える必要があります。

tomoki17
質問者

お礼

回答ありがとうございます。 うまく読み込むことができました!

その他の回答 (3)

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.4

一気に変数へ読み込もうとすると分からなくなってしまうと思います 1) 1行読み込む 2) 読み込んだデータを各桁で処理する 3) ファイルの終端でなければ 1)に戻る をコードにしてみましょう char lbuf[32] = {0}; // ちょっと大目の行バッファ char a[3][8] = {0}; // 読み込み後のデータ格納変数 int nLine = 0; // a[n]のカウンタ int nLen = 0; // 行バッファの長さ検査用 while( fgets( lbuf, sizeof( lbuf ), fp ) ) {   nLen = strlen( lbuf ) - 1;   if ( nLen < 0 || nLen > 8 ) {     // 読み込んだデータの長さチェック     fprintf( stderr, "DataError\n" );     break;   }   if ( lbuf[nLen] == '\n' ) {     // 改行が付いているなら削除     lbuf[nLen] = 0;   }   for ( int n = 0; n < nLen; n++ ) {     // 各桁の処理     a[nLine][n] = lbuf[n] - '0';   }   // 次の行の準備   nLine++; } といった具合です

tomoki17
質問者

お礼

回答ありがとうございます。 たしかに一気にやろうとしたのが混乱を招く原因でした。 この経験を今後に生かしていきたいと思います!

回答No.3

バイナリで書き出して読み込むというのはどうでしょうか? 以下に動作テストはしていませんが、バイナリでのファイル操作の例を載せます。 #include<stdio.h> #define R 3 #define C 3 int main( ) { int i, k ; FILE *fp = NULL ; int mat[ R ][ C ] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } } ; int tmp[ R ][ C ] ; fp = fopen( "out.txt", "wb" ) ; fwrite( mat, R * C, sizeof( int ), fp ) ; fclose( fp ) ; fp = fopen( "out.txt", "rb" ) ; fread( tmp, sizeof( int ), R * C, fp ) ; fclose( fp ) ; for( i = 0 ; i < R ; i ++, puts( "" ) ) for( k = 0 ; k < C ; k ++ ) printf( "%d", tmp[ i ][ k ] ) ; }

tomoki17
質問者

お礼

回答ありがとうございます。 バイナリファイルについての知識が不足しているため、試すことができませんでしたが、今後、勉強して生かしていきたいと思います!

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ファイルIOなどすべて説明するのは不可能ですよ C言語のの入門書に基本的なファイルIOはのっているはずです それを参考に作ってみたコードを投稿してみましょう お使いの開発環境のバージョンやエディション、お使いのOSの情報 などと どのようなデータをどこからどのようにして何に読み込むのかを具体的に質問しましょう CSVファイルを配列に 行、列として読み込みたい 現状 かくかくしかじか のソースにて読み込んでいるが 期待する結果にならない 元データ a,b,c,d a,c,d,e a,d,g,h 実行時の読み込みデータ abcd acde adgh など具体的にしましょう

tomoki17
質問者

補足

回答ありがとうございます。 Visual C++を使っています。 テキストファイルに入力された0と1の組合せを読み込みたいです。 元データ 01010101 10101010 11010010 読み込み後 a[0][0]=0,a[0][1]=1,,,,,a[2][7]=0 のようにしたいです。 入門書には配列のファイル読み込みは載っているですが二次元配列の場合は、どのようにすれば良いのかわかりません。 つたない説明ですがよろしくお願いいたします。

関連するQ&A

  • 3×3よりも大きな行列の入力方法について

    2007 wordにて、挿入>特殊文字>数式>行列で、行列を入力する場合、 3×3はデフォルトで選択可能ですが、それよりも大きな行列はデフォルトで用意されていません。 5×5などの行列を入力する方法で、何か良い方法はないでしょうか。 よろしくお願い申し上げます。

  • エクセルで行列を入れ替えるをフォルダ単位で行いたい

    タイトルの通り、行列を入れ替えたいエクセルファイルがあるのですが、数が多くいちいちファイルを開いてやるのはあまり、いいやり方ではないかなと思っています。どなたか、ファイルをひからずに、フォルダに入っているファイルごとに行列入れ替えを適用する方法をご存知の方がいらっしゃいましたらよろしくお願いします。 入れ替えごのファイルは元のファイルを上書きしても大丈夫です。

  • この行列式を効率よく解く方法が見つかりません

    次の行列式を計算せよ。 |a bc a^2| |b ca b^2| |c ab c^2| …タイトル通りですが、この行列式を効率よく解く方法が見つかりません。 もし、第二列をすべてabcに出来たら括り出して並べ替えてファンデアモンデを使うのですが…。 でも、第一列を第二列に掛けたら、違う行列式になってしまいますよね…。 まずは最初の一歩だけを教えてください。お願いします。

  • 行列の括弧が入力できません。

    ワード2003、数式エディタ3.3を使っているのですが、 行列の括弧が入力できません。括弧の中に(2,2)以上の行列をはめ込むと括弧が消えてしまいます。 行列を入力してから括弧をつけようとしてもできません。 行列式はできるのですが、行列に使われる括弧は消えてしまいます。 他にも、いろんなものが入力できません。消えてしまうんです!! ものすごく困っています。どなたか教えてください!! 再インストールもだめでした。 以前は普通にできていたのですが・・・。

  • excelで行列を非表示にするとファイルサイズが大きくなるのはなぜ?

    質問はタイトル通りです. ドラッグしたときに不必要にカーソルが縦横に流れていく(この状態わかりますでしょうか?)のが厄介なので,右下の不要な行列を非表示に変えたところ,ファイルサイズが急に1MB近くなり,動きも遅くなってしまいました. こうなる理由はなぜなんでしょう?また,ドラッグしたときに,ある行列以上右,下にカーソルが行かないように,シートの行列数自体を小さくすることはできるのでしょうか?

  • ファイル名入力のタイトル削除の仕方

    エクセルやワードのファイルを開く際に、タイトルを入力する欄がありますが、既に使用していないタイトル(履歴の様に残ってしまっている物)を消す方法を教えてください。

  • 行列の連立一次方程式

    タイトルどおり行列の連立一次方程式がまったくわかりません   |1| x= | 3|   |0| までは掃き出し方でといたのですがそれ以降がわかりません 残りはどうやればいいのでしょうか? ちなみに答えは   |1|   |-3| x= | 3|+C |-1|   |0|   |1 | となってます

  • エクセル かな入力と英数入力を行列ごとに切り替える

    エクセルで住所録を作成していますが、 名前はかな入力、電話番号やメールアドレスは英数入力にしたいのですが、毎度切り替えずに 行列ごとに入力方法を切り替える方法はありますか。 宜しくお願いします。

  • 行列の比較

    M行N列(M×N)の行列A,B,Cがあるとき。 行列Aに対してBとCどちらが近いかを比較する方法には どのようなものがあるのでしょうか。 例 行列A(3×3) 1 1 1 1 1 1 1 1 1 行列B(3×3) 1 1 2 2 1 1 1 1 1 行列C(3×3) 2 2 2 2 2 2 2 2 2 例では誤差で考えるとBの方がAに近いのですが 行列内の互いの数値関係が同じ(同じ値)ということで Cの方がAに近い性質を現していることを数値で示したいと考えています つまり求めたいのは相関(?)のような近さです 思いつくのは一列づつ相関をとって最終的に全ての行での 平均をとる方法ですが 他に上手く(出来れば一つの数字で)近さの程度を表す方法や 一般的な方法があれば教えて頂けないでしょうか。 よろしくお願い致します。

  • 行列計算の因子入力について

     エクセル、特に行列計算に関して初心者です。エクセルを使って行列計算を行おうと思います。  念のため、ここで言う「行列」とは、一般に使われる「行と列」と言う意味ではなく、数学上の行列計算、所謂マトリクス演算のことです。  例えば以下のような2×2の行列を入力する場合、  1 2  3 4 ={1,2;3,4} と入力すればよいと言うところまでは分かったのですが、ここの1~4までの数値は直接キーボード等から入力することしかできません。  私としては別のセルにある数値や計算結果等をこの部分、たとえば「1」のところの値にしたいのですが、どうすればよいのでしょう?  以上、よろしくお願いいたします。

専門家に質問してみよう