---这是一个家庭作业问题---
我在使用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
答案 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 *
。失去&
。 scanf
和printf
在这方面并不对称。
头刮管:
你知道每行会有2个值,但是你的数组大小是5(而不是4或6或8)。您允许调整阵列的大小(正确地,我可能会添加),但您已经为打印循环硬编码了8的大小,而不是使用读取的实际项目数。