C:从textfile读取到struct数组中

我正在制作的程序应该从文本文件中读取数字并保存数字的总数,即结构中数字的平均值。

我有一个看起来像这样的结构:

struct seriepost { int totnr; int outnr; float average; }; 

function(未完成)看起来像这样:

 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然后我希望它跳到下一个系列的下一个arrays点。 所以我喜欢serie [0],serie [1]和他们自己的数字和平均值等。

如果您看到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 ,现在是数组的大小。

fscanf返回成功读取的项目数,而不是值。

 while (fscanf(tsin, "%f", &in_last) != 0.0) 

应该:

 while (fscanf(tsin, "%f", &in_last) != 1) 

此外,您无法将float与常量值进行比较。 这在大多数情况下都不起作用。 因此,您需要选择一个增量,然后检查您的浮点数是否在该范围内。

我想你也不想返回sizeof(serie)因为这是你在调用时已经知道的常量值。 您更有可能希望返回x-1以表示读取的值的数量。 如果满足feof条件,则您没有读取任何内容,x将为1(因为您的循环)。

顺便说一句:如果文本文件中没有固定大小的行,并且事先知道数组必须有多大,那么您的程序可能会出现问题。 您在读取时不会分配数组,但是您可以将其传递给它,因此当x增加时,您可能会超出arrays。