ページ 1 / 1
ファイルからすべての行を抽出し1行ずつ配列に格納
Posted: 2015年10月12日(月) 18:55
by mimi
ファイルからすべての行を抽出し1行ずつ配列に格納するプログラムを考えています。
ファイルにはdouble型の浮動小数が数行書かれています。
考え方では、ファイルから1行ずつfgets関数で抽出し、
atof関数でchar型からdouble型へ変換という手順を踏んでいます。
//宣言
char s[10000];
double number[10000];
int i=0;
//プログラム(略)
while(fgets(s,sizeof(s),fp)!=NULL){
number=atof(s);
i++;
}
しかし、numberの値を表示してみると0.000000...となります。
また、sは何も表示されません。
どのように改善すればよいかご指摘をよろしくお願いします。
Re: ファイルからすべての行を抽出し1行ずつ配列に格納
Posted: 2015年10月12日(月) 19:06
by box
mimi さんが書きました:
しかし、numberの値を表示してみると0.000000...となります。
また、sは何も表示されません。
そうなってしまうコード全体とデータを見せてください。
mimi さんが書きました:
ファイルにはdouble型の浮動小数が数行書かれています。
数行程度のファイルに
mimi さんが書きました:
double number[10000];
これは大げさではないでしょうか。
また、
mimi さんが書きました:
char s[10000];
ファイルの1行が本当に10000バイトもあるのでしょうか。
Re: ファイルからすべての行を抽出し1行ずつ配列に格納
Posted: 2015年10月12日(月) 21:09
by box
試しにこんなコードを書いてみたら、当方の環境ではうまくいきました。
コード:
#include <stdio.h>
#include <stdlib.h>
#define N (6) // 今回は6行だから
int main(void)
{
FILE *fp;
double data[N]; // データの格納場所
char str[20]; // 長さは適切に決める
int i;
fp = fopen("data.txt", "r");
if (!fp) return 1;
for (i = 0; i < N; i++) {
fgets(str, sizeof(str), fp);
data[i] = strtof(str, NULL);
}
fclose(fp);
for (i = 0; i < N; i++) {
printf("%f\n", data[i]);
}
return 0;
}
データは
コード:
1.23
-4.5678
0.987654
3.21098
-7.65
4.32109
ついでに、ほぼ同じ動きをするであろうプログラムを別の言語で書いてみました。
コード:
a = []
filename = "data.txt"
begin
file = File.open(filename)
file.each_line do |d|
a << d.to_f
end
file.close
a.each do |d|
puts d
end
rescue
puts "#{filename} not found"
end
Re: ファイルからすべての行を抽出し1行ずつ配列に格納
Posted: 2015年10月13日(火) 21:56
by mimi
>>boxさん
ありがとうございました!解決しました!
ソースコードを部分的に書いてしまって申し訳ありません。
原因はファイルを読み込んだ直後に
while((g=getc(fp))!=EOF) {
if(g=='\n') count++;
}
というファイルの行数を読み込むプログラムを書いてしまったため、
その直後に続く配列に格納するプログラムが動作しないことでした。
おそらくファイルを読みきってしまったためだからだと思われます。
上に書いたコードと配列に格納するコードの間でまた同じファイルを読み込むことで解決しました。(非効率的ですが・・・)
お早い回答ありがとうございました。