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

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

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

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

配列

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

Q&A

解決済

2回答

988閲覧

C言語 ファイルから数値読み込みの際、“ファイル名の一部を変更して繰り返す”方法

Cstdy_sun8

総合スコア8

C

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

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

配列

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

0グッド

0クリップ

投稿2019/12/29 10:11

編集2019/12/29 18:42

txtファイルからのデータの読み込みについてです.
a_data_1224_1.txt
a_data_1224_2.txt
:
:
a_data_1224_100.txt

には数値が100個ずつ入っています.これらのファイルから数値を取り出し配列に格納,各ファイルの1,2,....100番目の数値の平均をとるプログラムを作ろうとしました.

____________
【追記】
1.txtの1番目、2.txtの1番目、...100.txtの1番目 の平均

1.txtの2番目、2.txtの2番目、...100.txtの2番目 の平均

...

1.txtの100番目、2.txtの100番目、...100.txtの100番目 の平均

をheikin[]に格納したいです。わかりづらくてすみませんでした。

__________

いちいちファイル名の数字を変えて100個ぶん読み込みのコードを書くのは現実的ではなかったので,ファイル名の数字だけ変えて繰り返すようにしたいのですが,ファイルが読み込めません.どこがおかしいのでしょうか.また,以下の形以外にも代案はありますでしょうか.
よろしくお願いいたします.

C言語

1#include <stdio.h> 2 3int main(void) 4{ 5 int i; 6 int k; 7 double data[100]; 8 double copy_data[100]; 9 double heikin[100]; 10 char input_files[]={"a_data_1224_1.txt"}; 11 FILE *fp; 12 for(i=0; i<100; i++) 13 { 14 heikin[i] = 0; 15 } //初期化 16 for(k=0; k<100; k++) 17 { 18 input_files[12] = '1'+k; 19 //a_data_1224_""1"".txt この1を1~100に変えていく 20 fp = fopen(input_files,"r"); 21 22 if(fp == NULL) 23 { 24 printf("file not open \n"); 25 return -1; 26 }//ファイルが開けないときのエラー 27 28 for(i=0; i<100; i++) 29 { 30 fscanf(fp, "%lf", &(data[i])); 31 } 32 fclose(fp); 33 34 for(i=0; i<100; i++) 35 { 36 copy_data[i] = data[i]; 37 heikin[i] += copy_data[i]; //1+k個目のファイルまでの各データの平均 38 } 39 } 40} 41

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

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

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

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

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

guest

回答2

0

char input_files[64];
...
sprintf(input_files,"a_data_1224_%d.txt",i);

ってのでどうでしょうか

投稿2019/12/29 10:21

y_waiwai

総合スコア87774

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

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

Cstdy_sun8

2019/12/29 12:04

ありがとうございます。sprintfを使うのですね 質問なのですが、 ・なぜinput_filesの要素が64なのか? ・具体的に挿入・変更するとどうなるのか? をお聞きしたいです。
y_waiwai

2019/12/29 12:11

その64というのはあんまし意味はなく、iが十分大きな値でも異常アクセスになりえない程度のサイズということでテキトーに決めた値です > input_files[12] = '1'+k; 文字に足してますがこれでは意味不明です。 kが10以上になると、12文字目は数字ではない文字になってしまいます
rubato6809

2019/12/30 00:29 編集

y_waiwaiさんはテキトーに決めたんですね。私もテキトーに決めることが多いけど、この場合はガッチリ決めることができますよ。 input_files[] は "a_data_1224_1.txt" 〜 "a_data_1224_100.txt" というファイル名を格納する文字配列ですから、この中で一番長いファイル名を格納できる大きさがあれば良いのです。 最長は "a_data_1224_100.txt" の19文字でしょ。それに終端文字'\0' 分を足した20バイトの大きさがあれば良いということ。 よって、 char input_files[20]; まで絞り込めます。
rubato6809

2019/12/30 00:48

ホントに最近の質問見て知ったのだけど、これ char input_files[ sizeof "a_data_1224_100.txt" ]; という書き方ができるんだって!!
thkana

2019/12/30 01:05

ファイル名のフォーマットがどう変わっても対処できるようにFILENAME_MAXマクロを充てるのがいいような気が私はしますがどうでしょう? 過剰でしょうか。 (今の時代、PCベースなら数KBをケチる必要はないでしょう。RAMが2KBしかないArduino UNOでSDカードを使う、とかなら別ですが) --- > char input_files[ sizeof "a_data_1224_100.txt" ]; それも提案しようかと思ってましたが(後出し:-)。その場合でも #define FORMAT "a_data_1224_%d.txt" #define MAX_DIGITS 3 char input_files[sizeof(FORMAT)+MAX_DIGITS-2]; //桁数の補正 sprintf(input_files,FORMAT,i); とかのマクロ化はしたくなります。
rubato6809

2019/12/30 01:19

そういうマクロを作る時点で、どういう範囲のデータに対応するか、設計があるわけで、そこに作成者の考えが反映されますね。 上の例は最低20バイト必要だというように、極限のラインを正確に見積もることが大事だと思います。
nob.

2019/12/30 02:28

ファイルのコピーやフォルダの作成が出来るなら、 ・新しいフォルダを作る ・そのフォルダに対象のファイルすべてをコピーする ・そのフォルダに存在するファイル全てに、処理(平均をとる?)を施す というふうにすれば、ファイル名を知る必要をないのですが… こういう話はファイル名の形式やファイル数が変更になっても、うまく行くように考えたら? (コピーする作業自体が大変かも?)
guest

0

ベストアンサー

ご提示のコードは平均までは計算していないようです.

c

1#define DATA_COUNTS 100 2#define FILE_COUNTS 100 3 4int main(void) { 5 int i, j; 6 double data; 7 double heikin[DATA_COUNTS]; 8 char input_files[64]; 9 FILE *fp; 10 11 //初期化 12 for(i=0; i<DATA_COUNTS; i++) heikin[i] = 0; 13 14 for(j=1; j<=FILE_COUNTS; j++) { 15 //a_data_1224_""1"".txt この1を1~100に変えていく 16 sprintf(input_files, "a_data_1224_%d.txt", j); 17 fp = fopen(input_files,"r"); 18 if(fp == NULL) { 19 printf("%s not open\n", input_files); //ファイルが開けないときのエラー 20 return -1; 21 } 22 for(i=0; i<DATA_COUNTS; i++) { 23 fscanf(fp, "%lf", &data); 24 heikin[i] += data; //各データの合計 25 } 26 fclose(fp); 27 } 28 29 //各データの平均 30 for(i=0; i<DATA_COUNTS; i++) heikin[i] /= FILE_COUNTS; 31}

投稿2019/12/29 14:11

jimbe

総合スコア12648

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

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

Cstdy_sun8

2019/12/29 18:37

細かい回答ありがとうございます。やはりsprintfを使うのですね。 平均出し忘れ(割ってない)はミスでした。すみません。 heikin[0]=1.txtの1番目、2.txtの1番目、....、100.txtの1番目 の平均 heikin[1]=1.txtの2番目、2.txtの2番目、....、100.txtの2番目 の平均 . . . heikin[99]=1.txtの100番目、2.txtの100番目、....、100.txtの100番目 の平均 となるようにしたいのですが、その場合はこのコードどこを変更すればいいでしょうか...?わかりづらくてすみません。
jimbe

2019/12/30 00:57

そのようなコードにしたつもりですが, なっていませんでしょうか.
rubato6809

2019/12/30 03:39

> やはりsprintfを使うのですね 私もそれが一番やりやすいと思います。 念の為、input_files[12] = '1'+k; は明確なバグですよ。k が9になったら、そこは数字じゃなくなります。どんな文字列になるか、そこだけ確かめると良いですよ。
Cstdy_sun8

2019/12/30 04:34

>jimbeさん 目的のものでした。頭であれこれ考える前に手を動かすべきでしたね。ありがとうございます。 >rubato6809さん はい、桁増えるのを考えていませんでした。ご指摘ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問