c - 如何从c中的文件中读取 float ?

标签 c file

我正在努力从我在程序生命周期内创建的文件中读取 float 。我试图倒带文件,我试图在读取文件之前打开和关闭文件,我试图将值直接放入表中并通过另一个变量。我不知道我还能做什么,这里出了什么问题?

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

最佳答案

这段代码存在很多问题。首先,正如评论中指出的,最初的分配是错误的。您正在为 float 分配空间,而不是为 int 分配空间。如果您像这样编写对 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 

关于c - 如何从c中的文件中读取 float ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42071670/

相关文章:

c - 联机帮助页 scandir() 原型(prototype)怪异

c++ - 可以在 Windows 上创建受密码保护的 zip 文件的 C zip 库?

python - 使用python在Linux中分配特定大小的文件

c++ - 如何知道写入文件何时完成?

c - 在C语言中,我如何c写一个函数来打开一个csv文件并将值读入数组?

c 段错误 fgets

c - 为什么我的程序不对结构进行排序?

java - 获取应用程序文件路径

java - 在文件中搜索字符串并返回该特定行

java - 我如何用 Java 读取俄语文件?