2016-10-30 18 views
0

だから、これはかなり簡単だと思います。私は実際に何が間違っているのかを理解することさえできず、それが私を最も嫌うものです。ファイルからの読み込みに問題があります。

私はファイルからいくつかの数字を読まなければなりませんが、これらの数字は科学的表記です。サンプルファイルには、このような数字を持っているでしょう:

1.00090E+00,2.90000E+00 

だから私は、私は単純に、このようにそれを読んだと思った:ダブルは、無視し、別のダブルを取得し、文字を無視し、int型を取得し、文字を無視します文字、そしてこの例のように、それは希望、最終的にint型を取得します:

だから、
get (1.00090) 
ignore (E) 
get (+00) 
ignore (,) 
get (2.90000) 
ignore (E) 
get (+00) 

、私はこれらの関数fscanfを書いた:

fscanf(arquivo, " %lf%*c%d%*c", &mantissa1, &expoente1); 
x[i] = numToFloat(mantissa1, expoente1); 
fscanf(arquivo, "%lf%*c%d", &mantissa2, &expoente2); 
fx[i] = numToFloat(mantissa2, expoente2); 

私は理解を簡単にするためにそれらを分離しました。しかし、その後、それは動作しません。最初の倍精度浮動小数点数型(double)を正しく読み込みますが、それはintを駄目にします。そして、それは2番目のfscanfのすべてを駄目にします。 私は考えることができるすべてを試みた。書式設定された文字列をfscanf("%lfE%d,"および"%lfE%d")に配置します。信号を文字変数("%lf%*c%c%d%*c")に読み込む。それは動作しません。

何が間違っていると思いますか?

答えて

1

まず、仮数と指数を別々に解析する必要はありません。 scanfネイティブにn.nnnE±nnn表記を理解しています。これは、フォーマット文字列が期待どおりに動作しない理由です。 %lfディレクティブはE+00ピースを含む最初の数字をすべて消費します。%*cは、%d2を消費します。

第2のyou should not use any of thescanf functions, ever。代わりに、fgets(またはそれがある場合はgetline)を使用して一度に1行ずつ読み込み、strtokでコンマで区切り、数字をstrtod(これもネイティブに科学記法を理解しています)でバイナリに変換してください。これは、より多くのコーディングを行うことになりますが、結果は読みやすくデバッグしやすくなります。誤った入力に対してロバストにするのが簡単になり、入力のオーバーフローに対して明確な動作をします。

(技術的には、各番号が終わるところを教えてくれますstrtodとして、strtokを使用する必要はありませんが、それは最初概念的分割を行うことが簡単です。)

0

あなたはこの例を適応することができるかもしれません

#include <stdio.h> 

int main(void){ 
    double d, e; 
    int n; 
    printf("Enter 2 scientific floats: "); 
    fflush(stdout); 
    n = scanf("%lg %*c %lg", &d, &e); 
    if(n == 2) { 
     printf("%f\n", d); 
     printf("%f\n", e); 
    } else { 
     printf("Bad input\n"); 
    } 
} 

プログラムセッション

Enter 2 scientific floats: 1.8e+4,4.2e-1 
18000.000000 
0.420000 
:あなたのニーズに、それは %lg書式指定子を使用しました
関連する問題