ファイルからすべての行を抽出し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は何も表示されません。
どのように改善すればよいかご指摘をよろしくお願いします。
ファイルからすべての行を抽出し1行ずつ配列に格納
Re: ファイルからすべての行を抽出し1行ずつ配列に格納
そうなってしまうコード全体とデータを見せてください。mimi さんが書きました: しかし、numberの値を表示してみると0.000000...となります。
また、sは何も表示されません。
数行程度のファイルにmimi さんが書きました: ファイルにはdouble型の浮動小数が数行書かれています。
これは大げさではないでしょうか。mimi さんが書きました: double number[10000];
また、
ファイルの1行が本当に10000バイトもあるのでしょうか。mimi さんが書きました: char s[10000];
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: ファイルからすべての行を抽出し1行ずつ配列に格納
試しにこんなコードを書いてみたら、当方の環境ではうまくいきました。
データは
ついでに、ほぼ同じ動きをするであろうプログラムを別の言語で書いてみました。
#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;
}
ついでに、ほぼ同じ動きをするであろうプログラムを別の言語で書いてみました。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。
プログラムは思ったとおりには動かない。書いたとおりに動く。
Re: ファイルからすべての行を抽出し1行ずつ配列に格納
>>boxさん
ありがとうございました!解決しました!
ソースコードを部分的に書いてしまって申し訳ありません。
原因はファイルを読み込んだ直後に
while((g=getc(fp))!=EOF) {
if(g=='\n') count++;
}
というファイルの行数を読み込むプログラムを書いてしまったため、
その直後に続く配列に格納するプログラムが動作しないことでした。
おそらくファイルを読みきってしまったためだからだと思われます。
上に書いたコードと配列に格納するコードの間でまた同じファイルを読み込むことで解決しました。(非効率的ですが・・・)
お早い回答ありがとうございました。
ありがとうございました!解決しました!
ソースコードを部分的に書いてしまって申し訳ありません。
原因はファイルを読み込んだ直後に
while((g=getc(fp))!=EOF) {
if(g=='\n') count++;
}
というファイルの行数を読み込むプログラムを書いてしまったため、
その直後に続く配列に格納するプログラムが動作しないことでした。
おそらくファイルを読みきってしまったためだからだと思われます。
上に書いたコードと配列に格納するコードの間でまた同じファイルを読み込むことで解決しました。(非効率的ですが・・・)
お早い回答ありがとうございました。