- ベストアンサー
行列のファイル入力の仕方
タイトルのとおりCで行列をファイルから入力する方法がわからず困っています。 わかる方いらっしゃったらお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
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); -- 「行列要素は全部一桁」が前提なので二桁以上の場合はやり方を変える必要があります。
その他の回答 (3)
- redfox63
- ベストアンサー率71% (1325/1856)
一気に変数へ読み込もうとすると分からなくなってしまうと思います 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++; } といった具合です
お礼
回答ありがとうございます。 たしかに一気にやろうとしたのが混乱を招く原因でした。 この経験を今後に生かしていきたいと思います!
- Prog_HIGE
- ベストアンサー率33% (1/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 ] ) ; }
お礼
回答ありがとうございます。 バイナリファイルについての知識が不足しているため、試すことができませんでしたが、今後、勉強して生かしていきたいと思います!
- redfox63
- ベストアンサー率71% (1325/1856)
ファイルIOなどすべて説明するのは不可能ですよ C言語のの入門書に基本的なファイルIOはのっているはずです それを参考に作ってみたコードを投稿してみましょう お使いの開発環境のバージョンやエディション、お使いのOSの情報 などと どのようなデータをどこからどのようにして何に読み込むのかを具体的に質問しましょう CSVファイルを配列に 行、列として読み込みたい 現状 かくかくしかじか のソースにて読み込んでいるが 期待する結果にならない 元データ a,b,c,d a,c,d,e a,d,g,h 実行時の読み込みデータ abcd acde adgh など具体的にしましょう
補足
回答ありがとうございます。 Visual C++を使っています。 テキストファイルに入力された0と1の組合せを読み込みたいです。 元データ 01010101 10101010 11010010 読み込み後 a[0][0]=0,a[0][1]=1,,,,,a[2][7]=0 のようにしたいです。 入門書には配列のファイル読み込みは載っているですが二次元配列の場合は、どのようにすれば良いのかわかりません。 つたない説明ですがよろしくお願いいたします。
お礼
回答ありがとうございます。 うまく読み込むことができました!