C语言 从txt阅读双精度数

2lpgd968  于 2023-04-05  发布在  其他
关注(0)|答案(1)|浏览(126)

我在创建一个从.txt文件中读取数字然后将它们写入单独变量的函数时遇到了麻烦。
这是我写的代码,在这里我试着只读四个数字,看看代码是否有效:

void read_prop_data(double *prop1, double *prop2, double *prop3, double *prop4) {
    FILE *file_pointer = fopen("prop_dati.txt", "r");
    if (file_pointer == NULL) {
        printf("Unable to open file\n");
        return 1;
    }

    fscanf(file_pointer, "%lf", prop1);
    fscanf(file_pointer, "%lf", prop2);
    fscanf(file_pointer, "%lf", prop3);
    fscanf(file_pointer, "%lf", prop4);

    printf("The values of the properties are: %lf %lf %lf %lf\n",
           *prop1, *prop2, *prop3, *prop4);

    fclose(file_pointer);
}

int main() {
    double prop1, prop2, prop3, prop4;
    read_prop_data(&prop1, &prop2, &prop3, &prop4);
    return 0;
}

下面是文件prop_dati.txt的前四行:

2
0.4
2
0.998

下面是函数打印的内容:

The values of the properties are: 0.000000 0.000000 0.000000 0.000000

你知道为什么我的函数不能读取文件中的数字吗?

i5desfxk

i5desfxk1#

以下是一些你应该解决的问题:

  • 添加标准include指令:#include <stdio.h>
  • read_prop_data的返回类型更改为int,并返回成功读取的次数;
  • 测试fscanf()的返回值以检测转换错误。我怀疑文件在第一个数字之前包含其他数据...可能是fscanf()没有跳过的字节顺序标记(BOM)。
  • 只输出成功读取的数字。

这里有一个修改过的版本,你可以试试:

#include <errno.h>
#include <stdio.h>
#include <string.h>

int read_prop_data(double *prop1, double *prop2, double *prop3, double *prop4) {
    FILE *file_pointer = fopen("prop_dati.txt", "r");
    if (file_pointer == NULL) {
        fprintf(stderr, "Unable to open %s: %s\n", "prop_dati.txt", strerror(errno));
        return -1;
    }

    int n = fscanf(file_pointer, "%lf %lf %lf %lf", prop1, prop2, prop3, prop4);
    if (n > 0) {
        printf("Read %d properties:", n);
        if (n >= 1) printf(" %lf", *prop1);
        if (n >= 2) printf(" %lf", *prop2);
        if (n >= 3) printf(" %lf", *prop3);
        if (n >= 4) printf(" %lf", *prop4);
        printf("\n");
    }
    if (n < 4) {
        // show the next 3 bytes
        printf("pending characters:");
        for (int i = 0; i < 3; i++) {
            c = fgetc(file_pointer);
            if (c == EOF) {
                printf(" EOF");
                break;
            } else {
                printf(" %02X", (unsigned char)c);
            }
        }
        printf("\n");
    }
    fclose(file_pointer);
    return n;
}

int main(void) {
    double prop1, prop2, prop3, prop4;
    read_prop_data(&prop1, &prop2, &prop3, &prop4);
    return 0;
}

相关问题