ファイルからすべての行を抽出し1行ずつ配列に格納

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
mimi

ファイルからすべての行を抽出し1行ずつ配列に格納

#1

投稿記事 by mimi » 9年前

ファイルからすべての行を抽出し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は何も表示されません。

どのように改善すればよいかご指摘をよろしくお願いします。

box
記事: 2002
登録日時: 14年前

Re: ファイルからすべての行を抽出し1行ずつ配列に格納

#2

投稿記事 by box » 9年前

mimi さんが書きました: しかし、numberの値を表示してみると0.000000...となります。
また、sは何も表示されません。
そうなってしまうコード全体とデータを見せてください。
mimi さんが書きました: ファイルにはdouble型の浮動小数が数行書かれています。
数行程度のファイルに
mimi さんが書きました: double number[10000];
これは大げさではないでしょうか。
また、
mimi さんが書きました: char s[10000];
ファイルの1行が本当に10000バイトもあるのでしょうか。
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

box
記事: 2002
登録日時: 14年前

Re: ファイルからすべての行を抽出し1行ずつ配列に格納

#3

投稿記事 by box » 9年前

試しにこんなコードを書いてみたら、当方の環境ではうまくいきました。

コード:

#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
バグのないプログラムはない。
プログラムは思ったとおりには動かない。書いたとおりに動く。

mimi

Re: ファイルからすべての行を抽出し1行ずつ配列に格納

#4

投稿記事 by mimi » 9年前

>>boxさん

ありがとうございました!解決しました!
ソースコードを部分的に書いてしまって申し訳ありません。
原因はファイルを読み込んだ直後に

while((g=getc(fp))!=EOF) {
if(g=='\n') count++;
}

というファイルの行数を読み込むプログラムを書いてしまったため、
その直後に続く配列に格納するプログラムが動作しないことでした。
おそらくファイルを読みきってしまったためだからだと思われます。

上に書いたコードと配列に格納するコードの間でまた同じファイルを読み込むことで解決しました。(非効率的ですが・・・)

お早い回答ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る