C:从文本文件读入结构数组

标签 c arrays file text struct

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

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

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

最佳答案

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

关于C:从文本文件读入结构数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18187698/

相关文章:

java - 在任何计算机上创建或读取文件

c - Linux 信号处理。如何获取中断指令的地址?

c - 如何在C中删除列表的最后一个元素

java - 替换 Java5 中的 Java6+ Arrays.binarySearch

c++ - 可以将 &my_boost_array_variable[2] 传递给期望 void* 的 C 函数吗?

Perl脚本从多个txt文件中读取和打印行?

c - 在 C 中读取文本文件时,如何阻止 Windows C 库将 "\r\n"转换为 "\n"?

c - 将 $n 替换为字符串中的 n

c++ - 使用 sleep() 以一秒为间隔打印数组元素

java - 设置文件权限总是返回 FALSE