fscanf 用于 int 和 float returns 大值用于 int,NAN 用于 float

fscanf for int and float returns large value for int, and NAN for float

我正在尝试从数据类型为 intfloat 的配置文件中存储一系列值。我不确定为什么,但是当我打印数组中的值时,int 值 returns 是一个大数字,而浮点数 return NAN.

配置文件:

1666    -0.314913523    0.999804843
1667    -0.337279687    0.999865966
1703    -0.323162231    0.999774194
1704    -0.311984064    0.99964375
1705    -0.311984064    0.99964375
1706    -0.313381260    0.999671436
1707    -0.313170802    0.999558174

我的代码:

#include <iostream>
using namespace std;

#define NUM_ITEMS 50
int main()
{
    FILE *fp;
    fp = fopen("config.conf","r");
    

    int a[NUM_ITEMS][NUM_ITEMS];
    float b[NUM_ITEMS][NUM_ITEMS];
    float c[NUM_ITEMS][NUM_ITEMS];

    int i = 0;

    while(fscanf(fp,"%i\t%f\t%f", a[i], b[i], c[i]) != EOF)
    {
        printf("%i  %f  %f\n", a[i], b[i], c[i]);
        i++;
    }
    
    fclose(fp);
}

输出:

1149516976      -nan    0.000000
1149517176      -nan    0.000000
1149517376      -nan    0.000000
1149517576      -nan    0.000000
1149517776      -nan    0.000000
1149517976      -nan    0.000000
1149518176      -nan    0.000000
    int a[NUM_ITEMS][NUM_ITEMS];
    float b[NUM_ITEMS][NUM_ITEMS];
    float c[NUM_ITEMS][NUM_ITEMS];

这使得abc数组成为数组,所以a[i]是一个数组。你想要:

    int a[NUM_ITEMS];
    float b[NUM_ITEMS];
    float c[NUM_ITEMS];

所以 a 是一个 int 的数组,现在 a[i] 是一个 int。不过,您需要将地址传递给 scanf

这是修复了所有主要问题的代码:

#include <iostream>

#define NUM_ITEMS 50
int main()
{
    FILE *fp;
    fp = fopen("config.conf","r");
    if (fp == NULL)
        return -1;
    

    int a[NUM_ITEMS];
    float b[NUM_ITEMS];
    float c[NUM_ITEMS];

    int i = 0;

    while(fscanf(fp,"%i\t%f\t%f", &a[i], &b[i], &c[i]) == 3)
    {
        printf("%i  %f  %f\n", a[i], b[i], c[i]);
        i++;
    }
    
    fclose(fp);
}