- 締切済み
データの読み込みがうまくいかなくて、困っています
プログラミング初心者です。 誤差逆伝播学習のプログラムを行っています。 C言語で、データの読み込み部分がうまくいかなくて、困っています。 borland , BCC Developerなどを用いてやっております。 やりたいことは、テキストファイルから数字を読み込み、それを行列に格納してデータとして送るということです。 その際に、テキストファイルで行と列で表示されたものを送ろうと考えています。30×30の、1と0で表示された絵と教師信号を読み取っています。 列だけの読み込みは正常に動いたのですが、行と列で表示されたものの読み込みができません。char型で変数を宣言しているので、数字として読み込めていないとか、そういったことがあるのでしょうか。o1[][],t[][]の部分に正しく値が送れるようにしたいです。 非常にわかりにくくて申し訳ないのですが、お分かりになる方がいたら、どこをどう変えれば良いか、教えて頂きたいです。 「間違っている列と行の読み込み」 //データをファイルから読み込む// void read_file(name) char *name; { int i,j,k; //ループカウンター// FILE *fp; //ファイルポインタ// char buff[MCHS]; //buffの最大文字数1024 //ファイルオープン// if((fp=fopen(name,"r"))==NULL){ fprintf(stderr,"%s:File open error !!\n",name); exit(-1); } //学習データを読み込む// fscanf(fp, "%d",&learning_pattern_no); //学習パターンの数読み込み fscanf(fp,"%d",&test_pattern_no); //テストパターンの数読み込み printf("学習パターンの数:%d\n",learning_pattern_no); //学習パターンの数表示 printf("テストパターンの数:%d\n",test_pattern_no); //テストパターンの数表示 i=0;j=0; while( fgets( buff, MCHS, fp ) != NULL ){ if(j<=learning_pattern_no+test_pattern_no-1){ for( k=0; k<MCHS; k++ ){ o1[j][i+k]=buff[k]; //o1[j][i+k]にbuff[k]を入れる printf("%c",buff[k]); //printfで確認 if( buff[k] =='\n'){ i=i+k; if (i==InputUnitNo){ i=0; j++; printf("%d",j); }//if(i==InputUnitNo)終了 break; }//if(buff[k])終了 }//for終了 }//if(j<=learn+test)終了 else{ //ここから教師信号の読み取り for( k=0; k<MCHS; k++ ){ t[i][k]=buff[k]; printf("%c",buff[k]); //教師信号の確認 if( buff[k] == '\n' ){ i++; break; }//if(buff[k])終了 }//for終了 }//else終了 }//while終了 } 「正常に動いた列だけの読み込み」 //データをファイルから読み込む// void read_file(name) char *name; { int i,j; //ループカウンター// FILE *fp; //ファイルポインタ// //ファイルオープン// if((fp=fopen(name,"r"))==NULL){ fprintf(stderr,"%s:File open error !!\n",name); exit(-1); } //学習データを読み込む// fscanf(fp, "%d",&learning_pattern_no); printf("学習データの数:%d\n",learning_pattern_no); for(i=0;i<learning_pattern_no; i++){ for(j=0;j<InputUnitNo; j++) fscanf(fp,"%lf",&o1[i][j]); for(j=0;j<OutputUnitNo; j++) fscanf(fp,"%lf",&t[i][j]); //教師信号 } //テストデータを読み込む// fscanf(fp,"%d",&test_pattern_no); printf("テストデータの数:%d\n",test_pattern_no); for(i=learning_pattern_no;i<learning_pattern_no+test_pattern_no;i++) for(j=0;j<InputUnitNo;j++) fscanf(fp,"%lf",&o1[i][j]); fclose(fp); }
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- Tacosan
- ベストアンサー率23% (3656/15482)
.... 単純に「fgets で読み込んでいるので, 全て文字として入力されている」だけ? 上の「間違っている列と行の読み込み」で, o1[j][i+k]=buff[k]; //o1[j][i+k]にbuff[k]を入れる の次に printf("%f\n", o1[j][i+k]); という行を追加して o1 の中身を表示させてみてください. どのような値が表示されますか? あ, ついでだけど o1 は double の配列ってことでいいんですよね?
- Tacosan
- ベストアンサー率23% (3656/15482)
もちろん「char で読み込んだ」ら '0' とか '1' という値になるわけで, これは (一般には) 0 や 1 という整数値とは異なります. あと, その「テキストデータ」のフォーマットを詳しく説明してもらえませんか? 特に「0 と 1 で表示された絵」の部分で, 各データの間に空白があるかどうかがちょっと気になります. ついでに余談だけど, いまさら void read_file(name) char *name; という形の関数定義をするべきではありません. void read_file(const char *name) くらいにしましょう (ファイル名を変更することはないと思うので const も追加してみました).
お礼
cortotbachさん、Tacosanさんお返事ありがとうございます。 テキストファイルはこのようになっております。 4 //学習パターン数 2 //テストパターン数 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 111111111111111111111111111111 以下、一行空けて、同じような30×30の画像(数字)が続く形になっています。そして、最後に認識番号のような教師信号を1000,0100と入る形になっています。一行空けるのは、画像と画像がくっついてしまうと、わかりづらくなってしまうと思ったからです。
- cortotbach
- ベストアンサー率44% (8/18)
質問のされ方をもう少し工夫した方が良いですね。 データの入っているテキストデータのフォーマットを明確にしないとよくわかりません。 課題かレポートなのかもしれませんが、それでも条件・課題内容と不明な点をもう少し説明された方が良いと思います。 ヒントですが、 fscanf(fp, "%d",&learning_pattern_no); //学習パターンの数読み込み というように1行読み込みを上部で使っているのであれば、 while( fgets( buff, MCHS, fp ) != NULL ){ このような取得の方法ではなく、同じように1行ずつ読んでいけば簡単かと思います。データは行と列のテキスト(ASCII)なのですよね? たとえば、 int line[30]; fscanf(fp, "%d %d %d......", line[0], line[1], line[2],....); みたいな感じで(列が半角スペース区切りの場合ですが)、1行を一気に読んでしまえば良いかと思います。 それを30行分繰り返すなど。あんまり美しくは無いですが。
補足
お返事ありがとうございます。 試してみたところ、0.480000という数字がたくさん出てき、 「printf("%c",buff[k]); //printfで確認」の部分の1と0で表せられていた画像が消えてしまいました。 o1はdoubleの配列です。わかりづらくて、すみません。