我正在制作的程序应该从文本文件中读取数字并保存数字的总数,即结构中数字的平均值。
我有一个看起来像这样的结构:
struct seriepost {
int totnr;
int outnr;
float average;
};
功能(未完成)看起来像这样:
int read_data(FILE *tsin, struct seriepost serie[]) {
int x = 0;
float average = 0;
float in_last = 0;
while (!feof(tsin))
{
while (fscanf(tsin, "%f", &in_last) != 0.0)
{
serie[x].totnr += 1;
serie[x].medel = average/serie[x].totnr;
serie[x].outnr = average*1.05+average*0.95;
}
x += 1;
}
fclose(tsin);
return sizeof(serie);
}
文本文件如下所示:
22.2 12.4 24.5 12.4.....
22.2 12.2 0.0
2.21 12.1 11.1 11.1....
1.1 0.0
其中0.0表示系列的结尾。
现在我希望fscanf读取所有数字直到0.0然后我希望它跳到下一个系列的下一个阵列点。所以我喜欢serie [0],serie [1]和他们自己的数字和平均值等。
答案 0 :(得分:2)
如果您看到reference of fscanf
,则会看到它返回成功扫描的项目数,而不是您刚刚扫描的值。
这意味着您必须以不同方式检查结束条件。
您也不应该循环while (!feof(...))
,因为在您尝试读取超出文件末尾之前,不会设置文件结束条件。
相反,你可以这样做:
while (fscanf(tsin, " %f", &in_last) > 0)
{
if (in_last == 0.0f)
++x;
else
{
/* The rest of your code */
}
}
这将一直显示,直到您到达文件结尾或出现错误,并在您阅读0.0
后增加索引。 fscanf
格式字符串中的前导空格使fscanf
跳过空格(空格,制表符,换行符)。
您的代码还存在其他一些问题。例如,您不必更新average
变量。 serie[x].totnr
的值可能未初始化,因此在这种情况下增加它(并在一般操作中使用它)也将是未定义的。然后使用sizeof(series)
这不起作用,因为series
实际上不是函数中的数组而是指针,因此sizeof
运算符返回指针的大小而不是数字数组中的条目。而是返回x
,它现在是数组的大小。
答案 1 :(得分:0)
fscanf
返回成功读取的项目数,而不是值。
while (fscanf(tsin, "%f", &in_last) != 0.0)
应该是:
while (fscanf(tsin, "%f", &in_last) != 1)
此外,您无法将float
与常量值进行比较。这在大多数情况下都不起作用。因此,您需要选择一个增量,然后检查您的浮点数是否在该范围内。
我认为您也不想返回sizeof(serie)
,因为这是您在通话时已经知道的常数值。您更有可能希望返回x-1
来表示读取的值的数量。如果满足feof
条件,则您没有读取任何内容,x将为1(因为您的循环)。
BTW:如果文本文件中没有固定大小的行,并且事先知道数组必须有多大,那么您的程序可能会出现问题。你在阅读时没有分配数组,但是你传入了它,所以当x增加时,你可能会超出数组。