1

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

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

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] 和他们自己的一组数字和平均值等。

4

2 回答 2

2

如果您看到 的引用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)which 将不起作用,因为series它实际上不是函数中的数组而是指针,因此sizeof运算符返回指针的大小而不是数组中的条目数。而是返回x现在数组的大小。

于 2013-08-12T13:06:41.087 回答
0

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

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

应该:

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

此外,您不能将 afloat与常数值进行比较。这在大多数情况下是行不通的。所以你需要选择一个增量,然后检查你的浮点数是否在那个范围内。

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

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

于 2013-08-12T13:06:42.107 回答