如何从c中的文件中读取浮点数?

时间:2017-02-06 15:41:22

标签: c file

我正在努力从我在程序生命周期中创建的文件中读取浮点数。我试图回放文件,我试图在读取文件之前打开并关闭文件,我试图将值直接放在表中并通过另一个变量。我能做些什么,这里有什么问题?

#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;
}

1 个答案:

答案 0 :(得分:1)

此代码中存在许多问题。首先,如评论中所述,初始分配是错误的。您正在为float s分配空间,而不是int s。如果您已经将调用写入malloc(),则可以完全避免此问题:

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

此处,malloc()的结果未投出since it is not necessary in C。另请注意,不是使用显式类型作为sizeof运算符的参数,而是使用标识符。这保证了tab的任何类型(必须是指针),sizeof的结果都是正确的。此外,您应该始终检查分配是否成功。

fp = fclose是错的。这应该是fclose(fp)。在此之后,当您使用"w+"再次打开文件时,文件将被截断为零长度,并且您将丢失先前写入的数据。由于该文件已使用"w+"打开,因此请在此处使用rewind(fp)

对于你所做的重新分配,除了参数不完全正确之外,你应该知道一个潜在的问题。 realloc()可以在分配错误的情况下返回空指针。如果发生这种情况,并且您直接将realloc()的结果分配给要重新分配的指针(tab),那么您将丢失对先前分配的内存的引用。这是内存泄漏,数据丢失。执行此操作的方法是将realloc()的结果存储在您测试的临时指针中。如果临时指针是空指针,则出现错误;否则你可以安全地将返回值分配给原始指针。

如前所述,当您最后一次致电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