質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.75%

  • C

    3456questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • 配列

    490questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • ポインタ

    99questions

    ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

  • ファイルI/O

    37questions

    ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

C言語の3次元配列(文字列)

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 206

s_clalis

score 0

 前提・実現したいこと 

ファイルから1行ずつデータをchar型配列に読み込み、int型に変換してから配列の平均を除去・正規化し内積を計算して相関係数を算出するプログラムを作る。 
勉強のためにポインタと動的確保を使ってみることとする。 

 発生している問題・エラーメッセージ 

4つのファイル別のデータを各配列に入れて利用したいのですが、想定したとおりに構造ができず困っています。(data_raw[]に各4ファイルの階層がありその中のdata_raw[][]に数値が一行づつ入っている構造) 
今のところファイルの先頭の行が全てのdata_raw[]に入ってしまいます。これをdata_raw[][]に入れたいです。 

他の方法を選ぶべきでしたらご教授いただけると幸いです。 

 該当のソースコード 

#include "targetver.h" 

#define _CRT_SECURE_NO_WARNINGS 
#define F_C 4 //file_count 
#define D_S 85 //data_size 

#include <math.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <tchar.h> 


double in_pro(double v1[], double v2[], int size); 

int main(void) 
{ 
   FILE *fp; 
   int n = 0; 
   int sum[F_C], data[F_C][D_S]; 
   char *filename[F_C] = { "rdata1.txt", "rdata2.txt", "rdata3.txt", "rdata4.txt" }; 
   char ***data_raw; 
   double u1[] = { 1, 0, 0 }; 
   double u2[] = { 0, sqrt(3) / 2, 0.5 }; 
   double u3[] = { 0, 0.5, -sqrt(3) / 2 }; 
   double xn[] = { 2, -1, 1 }; 
   double a[3]; 
   double x[6]; 
   double g[3]; 

   data_raw = (char ***)malloc(sizeof(char **) * F_C); 
   for (size_t i = 0; i < F_C; i++) 
   { 
       data_raw[i] = (char **)malloc(sizeof(char *) * D_S); 
       for (size_t j = 0; j < D_S; j++) 
       { 
           data_raw[i][j] = (char *)malloc(sizeof(char) * 0x10); 
       } 
   } 

   for (size_t i = 0; i < F_C; i++) 
   { 
       if ((fp = fopen(filename[i], "r")) == NULL) 
       { 
           fprintf(stderr, "Failed to opening %s.\n", filename[i]); 
           exit(EXIT_FAILURE); 
       } 

       while (fgets(data_raw[i][n], 0x10, fp) != NULL) 
       { 
           n++; 
           //puts(data_raw[i][n]); 
       } 
       n = 0; 
   } 

   for (size_t i = 0; i < F_C; i++) 
   { 
       for (size_t j = 0; j < D_S; j++) 
       { 
           data[i][j] = atoi(data_raw[i][j]); 
           sum[i] += data[i][j]; 
       } 
       sum[i] /= D_S; 
       printf("%d\n", sum[i]); 
   } 


   printf("***\tH30\tDSP1-3\t23\t***\n\n"); 

   printf("u1:[%f, %f, %f]\n", u1[0], u1[1], u1[2]); 
   printf("u2:[%f, %f, %f]\n", u2[0], u2[1], u2[2]); 
   printf("u3:[%f, %f, %f]\n \n", u3[0], u3[1], u3[2]); 

   x[0] = in_pro(u1, u1, 3); 
   x[1] = in_pro(u1, u2, 3); 
   x[2] = in_pro(u1, u3, 3); 
   x[3] = in_pro(u2, u2, 3); 
   x[4] = in_pro(u2, u3, 3); 
   x[5] = in_pro(u3, u3, 3); 

   printf("u1 * u1 : %f\n", x[0]); 
   printf("u1 * u2 : %f\n", x[1]); 
   printf("u1 * u3 : %f\n", x[2]); 
   printf("u2 * u2 : %f\n", x[3]); 
   printf("u2 * u3 : %f\n", x[4]); 
   printf("u3 * u3 : %f\n \n", x[5]); 

   a[0] = in_pro(xn, u1, 3); 
   a[1] = in_pro(xn, u2, 3); 
   a[2] = in_pro(xn, u3, 3); 

   printf("a1[%f], a2[%f], a3[%f]\n \n", a[0], a[1], a[2]); 

   for (size_t i = 0; i < 3; i++)   g[i] = a[0] * u1[i] + a[1] * u2[i] + a[2] * u3[i]; 

   printf("g[%f, %f, %f]\n", g[0], g[1], g[2]); 


   fclose(fp); 
   return 0; 
} 

double in_pro(double v1[], double v2[], int size) 
{ 
   int i; 
   double x = 0; 
   for (i = 0; i < size; i++)   x += v1[i] * v2[i]; 

   return x; 
} 

 

 補足情報(FW/ツールのバージョンなど) 

VisualStudio2015 
VCコンパイラ

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2018/05/30 19:41

    質問を編集前に戻してください。質問内容の削除は禁止されています。https://teratail.com/help/avoid-asking

    キャンセル

  • s_clalis

    2018/05/30 20:42

    分かりました。直ちに修正します。

    キャンセル

回答 4

checkベストアンサー

+2

        while (fgets(data_raw[i][n], 0x10, fp) != NULL)
        {
            n++;
            //puts(data_raw[i][n]);
        }


ここのn++後、D_Sと値チェックをしてwhile文を抜けないと、ファイル内容次第ではバッファオーバーのエラーが出るかな。
あとファイルは新しく開ける前に閉じましょう。ファイルポインタを使いまわしている。

ぱっと見ですが、そこらへんが気になりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 17:24

    以下のように変更してみました。しかし、ファイル先頭のデータしか読めません。質問のの愛用を更新しました。
    while (fgets(data_raw[i][n], 0x10, fp) != NULL)
    {
    if (n > D_S - 1) break;
    n++;
    puts(data_raw[i][n]);
    }
    n = 0;

    fclose(fp);

    キャンセル

+2

これ動的メモリ使う必要ありますか?
data_rawはファイルの中身を格納するのみで、結局そのあとdataに数値変換して入れ替えてますよね。
しかもそのdataは静的メモリ。
だったら最初から、1行読み込み→数値変換→dataに格納で良いのではないでしょうか。
無理に動的メモリを使う必要はなさそうですが。
仮に一旦data_rawに入れておきたいというのであれば、ファイル数・行数・1行あたりの文字数の上限が決まっているのだから、char data_raw[F_C][D_S][0x10]でいいような気もします。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 17:00

    動的確保の練習と利用の練習に書いています。
     atoiして静的なdataに渡しているのは処理部の再利用のためです。もちろん大きさが決まっているので仰る通りの型の方がいいと思いました。

    キャンセル

0

ぱっと見、問題なさそうですが、、、
ちょっと気になったのが、

while (fgets(data_raw[i][n], 0x10, fp) != NULL)

nが D_S 以上になる事は無いでしょうか?
ファイルの最後に余分な改行があるとか。
--> 余分な改行があると、ここで実行時エラーとなります。

とりあえず、気づいた事として。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 17:20

    D_S以上になることはありません。
     ファイルの余分な改行とはどのことをいうのでしょうか。データは以下のようになっています。("[EOF]"は文字列ではありません)
    ```
    573
    577
    595



    132
    [EOF]
    ```

    キャンセル

-1

ありがとうございます。
残念ながら諦めました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.75%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    malloc関数、文字化け

    Windows で実験コードを作成していたら、表示がおかしくなりました。 #include<stdio.h> #include<stdlib.h> #include <str

  • 解決済

    配列

    n個のデータを配列に読み込み、平均と分散を求めるプログラムを作成して、下記のデータで試せ、という問題です。 {3.9,10.4,9.5,7.5,2.8,4.8,2.9,8.1,3

  • 解決済

    行と列が違う配列の掛け算

    前提 書籍で勉強している学生です。 書籍の2周目をしています。 書籍の解答がないため問題のヒントや解説をしていただけると嬉しいです。 問題 4行3列の行列と3行4列の行列の積を

  • 解決済

    fscanfがうまく動作しない

    前提・実現したいこと テキストファイルから情報を取り込みたい。 中身は Dbrenlhsij,11,162.2,55.9 Ijnpwthy,14,163.8,62.6 Csaztv

  • 受付中

    c言語 文字列を逆順にして出力する

    発生している問題・エラーメッセージ 文字列を逆順にする関数を作成したのですが最後の文字の入れ替えができません。少しいじるとコアダンプと出てしまいます。どなたか解決法を教えてください

  • 解決済

    数字の文字列を一桁ずつ数字として取り出す方法

    任意の数字列が文字列型として与えられたときに、それらの数字を整数型に変換して、一つずつ取り出したいのですが、その方法が分かりません 例えば、123456789という文字列がst

  • 解決済

    newをオーバーロードしたときに、環境によってセグフォが発生する

    前置き 次のコードをWandboxのgcc6.3.0でビルド・実行したところ、セグフォが発生しました。 #include <cstdlib> #include <iostr

  • 解決済

    C言語の3次元配列(文字列)の動的確保並びにfgetsによる読み込み

     前提・実現したいこと テキストファイルから1行ずつデータをchar型配列に読み込み、int型に変換してから配列の平均を除去・正規化し内積を計算して相関係数を算出するプログラムを作

同じタグがついた質問を見る

  • C

    3456questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • 配列

    490questions

    配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

  • ポインタ

    99questions

    ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

  • ファイルI/O

    37questions

    ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。