2017-04-07 5 views
2

現在、テキストファイルからそれぞれの行にそれぞれ不明な倍数のデータを取り込むプログラムを作成しています。これらの要素を配列に読み込む必要がありますが、動作していません。私のプリントループは動作しますが、ゼロだけが出力されます。私はたくさんのことを試してきて、ここに来る前に多くを見ました。これは私のコードです。あまりにも多くの数字がファイルにあった場合のコードもチェックしていなかった以外fscanf()結果のfscanfを使用してC言語の倍精度を読み取る方法

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    //Open an file to read from 
    FILE *file; 
    file = fopen("data.txt","r"); 
    if (file == NULL) 
    { 
     printf("File not found."); 
     return -1; 
    } 

    //Count the number of lines in the input file 
    int numLines = 0; //CHANGE TO 1 ??? 
    int ch; 
    do 
    { 
     ch = fgetc(file); 
     if (ch == '\n') 
      numLines++; 
    } while (ch != EOF); 

    //Put all of the data read into an array; 
    double input[numLines]; 
    int i = 0; 
    while ((fscanf(file, "%lf\n", &input[i])) == 1) 
     i++; 

    //Close the file 
    fclose(file); 

    //Test printing elements of array 
    for (i = 0; i < numLines; i++) 
     printf("%lf\n", input[i]); 

    return 0; 
} 
+6

ファイルのポインタを数えた後に[rewind'](https://linux.die.net/man/3/rewind)する必要があります。そうしないと、ファイルの終わりにいます実際の入力データを読み取ろうとします。 –

+1

'%lf"( '"%lf \ n "'ではなく)のような書式を使用して、末尾の空白をスキップします。 – Jens

+0

'printf("%f \ n "、input [i]);' 'l'は影響を与えません。浮動小数点数のためのprintfフォーマット指定子があるので、自動的に倍精度化されます。 – bruceg

答えて

0

OPのテストでは、良いです。

while ((fscanf(file, "%lf\n", &input[i])) == 1) 
    i++; 

そしてコードはiの最後の値を無視し、代わりに、より少ないが正常に走査された場合でも、numLines回印刷します。

for (i = 0; i < numLines; i++) 
    printf("%lf\n", input[i]); 

終了コードは、これが0行を印刷しているだろう

while (i < numLines && (fscanf(file, "%lf\n", &input[i])) == 1) 
    i++; 
for (j = 0; j < i; j++) 
    printf("%lf\n", input[j]); 

されている必要があります!ファイルを2回目のパスでリセットする必要がありました。 @paulr

rewind(file); 
while (i < numLines && (fscanf(file, "%lf\n", &input[i])) == 1) 
    ... 

さらなる問題は、'\n'のカウントが数値の数と同じであると仮定されます。これは、1行に複数の番号が与えられた場合や、最後の行に数字があり、まだ'\n'でない場合、簡単にだますことができます。

単純に、input[] 1を大きくし、実際のスキャン成功回数を印刷する数のカウントとして使用してください。より堅牢なコードは、一度に1行をfgets()と読み、追加のエラーチェックを含みます。

関連する問題