2

---这是一道作业题---

我在使用 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  
4

2 回答 2

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]);
于 2013-01-31T04:21:30.013 回答
0

第一个问题:

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

您正在尝试使用 in 的值i并在没有干预序列点的情况下&coordinates[i]对其进行修改。&coordinates[i++]这样做的行为是undefined,很可能不会做你想做的事。用于&coordinates[i+1]第二个参数。请注意,这意味着您必须使用或类似的方式i在循环中进行更新。i += 2请注意,保证&coordinates[i]&coordinates[i++].

第二个问题:

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

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

令人头疼的:

You know there are going to be 2 values per line, but you start your array size at 5 (rather than 4 or 6 or 8). You allow for resizing the array (correctly, I might add), but you've hardcoded a size of 8 for the print loop, rather than using the actual number of items read.

于 2013-01-31T04:35:21.083 回答