2017-02-06 53 views
0

私はプログラムの生涯中に作成したファイルからフロートを読み込むのに苦労しています。私はファイルを巻き戻そうとしていましたが、ファイルを読み込む前にファイルを開いて閉じようとしていましたが、テーブルに直接値を入れようとしていました。 Idk私は何をもっとやることができますか?何が間違っていますか?cでファイルから浮動小数点数を読み取る方法は?

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

int main(void) { 
    srand(time(NULL)); 

    float *tab; 
    float x = 0.0; 
    int i, size; 
    FILE *fp; 

    fp = fopen("data.txt", "w+"); 
    if (fp == NULL) { 
     printf("Error"); 
     system("PAUSE"); 
     exit(1); 
    } 
    printf("Size of table: "); 
    scanf("%d", &size); 

    tab = (int*)malloc(size * sizeof(int)); 

    for (i = 0; i < size; i++) { 
     tab[i] = (8.0 - 2.0) * (float)rand()/RAND_MAX + 2.0; 
     fprintf(fp, "%.2f ", tab[i]); 
    } 
    for (i = 0; i < size; i++) { 
     printf("%.2f ", tab[i]); 
    } 
    printf("\n"); 

    fp = fclose; 
    fp = fopen("data.txt", "w+"); 
    tab = realloc(tab, 2*size); 

    for (i = 0; i < size * 2; i+=2) { 
     fscanf(fp, "%f", &x); 
     printf("%.2f ", x); 
     //tab[i + 1] = tab[i]/2; 
    } 

    /*for (i = 0; i < size * 2; i++) { 
     printf("%.2f \n", tab[i]); 
    }*/ 


    fp = fclose; 
    printf("\n"); 
    system("PAUSE"); 
    return 0; 
} 
+6

は今、さあここで

が変更されたコードです。もしあなたが 'float * tab;'を持っているのであれば、なぜ 'tab =(int *)malloc(size * sizeof(int));'というのはどんな意味ですか?その種のコードはおそらく「働く」ことになるだろうが、明らかに多くの混乱を示している。 – unwind

+0

はい、あなたは間違いありません。しかし、それはファイルからの読み込みに影響しません。問題は同じです: – soommy12

+0

@xing doesnt work – soommy12

答えて

1

このコードには多くの問題があります。まず、コメントに記されているように、最初の割り当ては間違っています。 floatのスペースを割り当てていますが、intではなくスペースを割り当てています。ここで

tab = malloc(sizeof(*tab) * size); 

は、malloc()の結果がキャストされていない、since it is not necessary in C:あなたはこのようmalloc()への呼び出しを書いていた完全場合は、この問題を回避している可能性があります。また、演算子sizeofの引数に明示的な型を使用する代わりに、識別子が代わりに使用されることに注意してください。これにより、ポインタでなければならないtabのタイプが何であっても、sizeofの結果が正しいことが保証されます。また、割り当てが成功したかどうかを常に確認する必要があります。

fp = fcloseは間違っています。これはfclose(fp)にする必要があります。その後、"w+"でファイルを再度開くと、ファイルの長さがゼロに切り詰められ、以前に書き込まれたデータが失われます。ファイルは既に"w+"で開かれているので、ここではrewind(fp)を使用してください。

ここでの議論はまったく正しいわけではありませんが、あなたが気をつけなければならない潜在的な問題があります。 realloc()は、割り当てエラーが発生した場合にnullポインタを返すことができます。この場合、realloc()の結果を、再割り当てするポインタ(tab)に直接割り当てると、以前割り当てられたメモリへの参照が失われます。これはメモリリークで、データが失われました。これを行う方法は、realloc()の結果を一時ポインタに格納してテストすることです。一時ポインタがNULLポインタの場合、エラーが発生しました。そうしないと、元のポインタに戻り値を安全に割り当てることができます。

また、すでに述べたように、最終的にfclose()に電話するときは、fclose(fp)である必要があります。

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

int main(void) { 
    srand(time(NULL)); 

    float *tab, *temp;   // added temp for realloc() check 
    float x = 0.0; 
    int i, size; 
    FILE *fp; 

    fp = fopen("data.txt", "w+"); 
    if (fp == NULL) { 
     printf("Error"); 
     system("PAUSE"); 
     exit(1); 
    } 
    printf("Size of table: "); 
    scanf("%d", &size); 

    /* You should always check for allocation errors */ 
    if ((tab = malloc(sizeof(*tab) * size)) == NULL) { 
     fprintf(stderr, "Error in initial allocation\n"); 
     exit(EXIT_FAILURE); 
    } 

    for (i = 0; i < size; i++) { 
     tab[i] = (8.0 - 2.0) * (float)rand()/RAND_MAX + 2.0; 
     fprintf(fp, "%.2f ", tab[i]); 
    } 
    for (i = 0; i < size; i++) { 
     printf("%.2f ", tab[i]); 
    } 
    printf("\n"); 

// fclose(fp);      // not fp = fclose; 
// fp = fopen("data.txt", "w+"); // when you reopen, the file is truncated 
    rewind(fp);      // but just do this 

    /* Fixed this reallocation */ 
    temp = realloc(tab, sizeof(*tab) * size * 2);  
    if (temp == NULL) { 
     fprintf(stderr, "Error in reallocation\n"); 
     exit(EXIT_FAILURE); 
    } 
    tab = temp; 

    for (i = 0; i < size * 2; i+=2) { 
     fscanf(fp, "%f", &x); 
     printf("%.2f ", x); 
     //tab[i + 1] = tab[i]/2; 
    } 

    /*for (i = 0; i < size * 2; i++) { 
     printf("%.2f \n", tab[i]); 
    }*/ 


    fclose(fp);   // not fp = fclose; 
    printf("\n"); 
    system("PAUSE"); 
    return 0; 
} 

サンプルの相互作用:

Size of table: 10 
2.65 5.67 5.21 3.22 3.07 4.29 5.96 5.96 5.15 7.36 
2.65 5.67 5.21 3.22 3.07 4.29 5.96 5.96 5.15 7.36 
関連する問題