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

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

新規登録して質問してみよう
ただいま回答率
85.35%
C

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

Q&A

解決済

1回答

4486閲覧

「C言語」コンマ区切りの数字テキストファイルを読み込み配列に格納したのちに計算する

tori-a

総合スコア1

C

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

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

浮動小数点

浮動小数点は、コンピュータが数値を扱う際に実数を表現する方法のひとつです。 数値を、それぞれの桁の値が並んでいる仮数部と、小数点の場所を示す指数部で表します。

0グッド

1クリップ

投稿2021/10/09 09:54

前提・実現したいこと

C言語でファイルからデータを読み込み配列に格納し合計を計算するプログラムを作っています。
データは、浮動小数点であり、コンマ区切りで記載されています。

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

ファイルは開きはしたがうまく読み込めてません。

該当のソースコード

c言語

1#include<stdio.h> 2#include<stdlib.h> 3int main(){ 4 /*ファイルオープン*/ 5 char fname[]="input.txt"; 6 FILE *fp; 7 if((fp=fopen(fname,"r")) == NULL){ 8 printf("%s is not open\n",fname); 9 exit(EXIT_FAILURE); 10 } 11 /*ファイルのデータを格納*/ 12 int nx,ny; 13 int x=0,y=0; 14 fscanf(fp,"%d%d",&nx,&ny); 15 float data; 16 float **matrix_data; 17 printf("nx = %d ny = %d\n",nx,ny); 18 while((fscanf(fp,"%[^,]%f",&data)) != EOF){ 19 printf("ok1\n"); 20 printf("data = %f",data); 21 matrix_data[y][x]=data; 22 x++; 23 if(x==nx){ 24 x=0; 25 y++; 26 } 27 } 28 /*計算*/ 29 int i,j; 30 float xsum,ysum; 31 for(i=0;i<ny;i++){ 32 for(j=0;j<nx;j++){ 33 xsum += matrix_data[j][i]; 34 } 35 } 36 for(i=0;i<ny;i++){ 37 for(j=0;j<nx;j++){ 38 ysum += matrix_data[i][j]; 39 } 40 } 41 /*表示*/ 42 printf("x sum data = %f\ny sum data = %f\n",xsum,ysum); 43 return EXIT_SUCCESS; 44}

困っていること

実行結果
nx = 50 ny = 50
ok1
data = 0.000000
初めのデータすら読み込めません。
while((fscanf(fp,"%[^,]%f",&data)) != EOF)
この記述の仕方が違うのでしょうか?
コンマ区切りなので%[^,]と書いたのですが、ほかに方法などありますか?
データの間に空白があるからでしょうか?

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

windows10
VSCodeです。
//50*50の浮動小数点数が並んでいます。
//1行目がこのデータの行数
//2行目がこのデータの列数

input.txt
50
50
-0.001494466, -0.002262156,・・・・・0.589552, 0.1961814
・       ・
・       ・          
・       ・        
-0.002359286, -0.003296237,・・・・・0.2205848, 0.1523751
ここにより詳細な情報を記載してください。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

データを読み込む領域を確保せず、matrix_data は未初期化のポインタのままです。
fscanf の書式も間違っています。

次のコードは参考になりますか?

c

1#include <stdio.h> // fopen, fclose, fscanf, printf, putchar 2#include <stdlib.h> // malloc, free 3 4int main(void) 5{ 6 FILE *fp = fopen("input.txt", "r"); 7 if (!fp) return 1; 8 int m, n; 9 if (fscanf(fp, "%d%d", &m, &n) != 2) return 2; 10 float **a = malloc(sizeof(float *) * m); 11 if (!a) return 3; 12 a[0] = malloc(sizeof(float) * m * n); 13 if (!a[0]) return 4; 14 for (int i = 1; i < m; i++) a[i] = a[i-1] + n; 15 for (int i = 0; i < m; i++) 16 for (int j = 0; j < n; j++) 17 if (fscanf(fp, "%f%*c", &a[i][j]) != 1) return 5; 18 fclose(fp); 19 for (int i = 0; i < m; i++) { 20 for (int j = 0; j < n; j++) 21 printf("%16.9f", a[i][j]); 22 putchar('\n'); 23 } 24 free(a[0]); 25 free(a); 26}

fscanf の書式の "%*c" は ',' または '\n' を読み飛ばします。

input.txt

text

12 24 3-0.001494466, -0.002262156, 0.589552, 0.1961814 4-0.002359286, -0.003296237, 0.2205848, 0.1523751

実行結果

text

1 -0.001494466 -0.002262156 0.589551985 0.196181402 2 -0.002359286 -0.003296237 0.220584795 0.152375102

追記
使っている Cコンパイラが可変長配列(variable length array) をサポートしていれば
ポインタも malloc も free も要りません。
float a[m][n]; だけで済みます。
ただし、自動変数なのであまり大きなサイズの領域は確保できません。

投稿2021/10/09 10:33

編集2021/10/10 01:21
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tori-a

2021/10/18 09:28

ありがとうございます。問題は解決しました。
kazuma-s

2021/10/18 13:40

どのようにして解決したのかを書いてください。 malloc/free を使ったのか、可変長配列を使ったのか、 それとも別のやり方なのか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問