fscanf无法正确读取浮点数

时间:2013-01-31 04:15:09

标签: c scanf

---这是一个家庭作业问题---

我在使用fscanf从文本文件中读取浮点值时遇到问题。

基本上我正在尝试从文件中读取浮点值并将它们存储在动态数组中。 输入文件每行有两个浮点数。所以一行可能是“0.85 7.34”(不带引号)。所以我试图使用fscanf(fp,“%f%f”,& coordinates [i],& coordinates [i ++])来读取2个浮点值。当我打印它显示为0.00000。下面是我编写的代码及其产生的输出。

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

int main (int argc, char *argv []) {

FILE * fp = fopen("nums", "r");

float *coordinates;
float *tmp;
int i = 0;
int ARRAY_SIZE = 5;
coordinates = malloc(5*sizeof(float));

while (fscanf(fp,"%f %f", &coordinates[i], &coordinates[i++]) > 1)
{

  printf("iteration# %d | coord1 = %f coord2 = %f \n", i, &coordinates[i-1], &coordinates[i]);

  if (i >= ARRAY_SIZE)
  {
    tmp = realloc(coordinates, (i*2)*sizeof(float));
    coordinates = tmp;
    ARRAY_SIZE = i*2;
  }
  i++;
}

for(i = 0; i < 8; i++)
  printf("%f\n", &coordinates[i]);


return 0;
}

输出:

iteration# 1 | coord1 = 0.000000 coord2 = 0.000000 
iteration# 3 | coord1 = 0.000000 coord2 = 0.000000 
iteration# 5 | coord1 = 0.000000 coord2 = 0.000000 
iteration# 7 | coord1 = 0.000000 coord2 = 0.000000 
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000
0.000000  

2 个答案:

答案 0 :(得分:2)

您不要将{运营商&的“地址”与printf一起使用。 fscanf需要一个指向数据的指针,因此它知道可以更改变量值,而printf则不需要。

变化:

printf("iteration# %d | coord1 = %f coord2 = %f \n", i, &coordinates[i-1], &coordinates[i]);

要:

printf("iteration# %d | coord1 = %f coord2 = %f \n", i, coordinates[i-1], coordinates[i]);

答案 1 :(得分:0)

第一个问题:

 while (fscanf(fp,"%f %f", &coordinates[i], &coordinates[i++]) > 1)

您尝试在i中使用&coordinates[i]的值,并在&coordinates[i++]中修改它,而没有插入序列点。这样做的行为是 undefined ,很可能不会做你想要的。使用&coordinates[i+1]作为第二个参数。请注意,这意味着您必须使用i或类似内容更新循环中的i += 2。请注意, 保证在&coordinates[i]之前评估&coordinates[i++]

第二个问题:

printf("%f\n", &coordinates[i]);

同样,你调用了未定义的行为;您已告诉printf期望值为float的值,但您传递的值为float *。失去&scanfprintf在这方面并不对称。

头刮管:

你知道每行会有2个值,但是你的数组大小是5(而不是4或6或8)。您允许调整阵列的大小(正确地,我可能会添加),但您已经为打印循环硬编码了8的大小,而不是使用读取的实际项目数。