然后汇总txt文件中每10行的平均值

时间:2017-08-23 13:29:06

标签: c++ fstream

我有这个代码用于标题中提到的任务:

该程序从1个圆柱形文本文件中读取,其中数字相互低于。

#include <iostream>
#include <fstream>

using namespace std;

int main()
{

    double number;
    double sum = 0;

    ifstream average;
    average.open("average.txt");

    while (average >> number)
    {
        for(int i = 0; i < 10; i++)
        {
            sum = sum + number;

            i++;

            if (i = 9)
            {
                cout << sum / 10 << endl;
            }
         }
    {

    average.close();
    system("pause");
    return 0;
}

但不知何故,它并没有平均数字,只是将它们全部除以10。

可能是什么问题?

由于

2 个答案:

答案 0 :(得分:1)

可能的解决方案:

int i;
while (average.good()) // only while we are good
{
  sum = 0; // you need to clean it
  for(i = 0; i < 10; i++)
  {   
    average >> number;

    if (!average.good()) break; // if number of lines is not mod10

    sum = sum + number;
    // i++; you already do that in for loop
  }
  if (i)
  {
    cout << sum / i << endl; // only print after each 10 or less
  }
}

或使用单循环:

sum = 0;
int i = 0;

while (average >> number) {
  sum = sum + number;
  ++i;

  if (i == 10) {
    cout << sum / i << endl;
    sum = i = 0;
  }
}
if (i) {
  cout << sum / i << endl;
}

答案 1 :(得分:0)

您可以使用std::deque轻松实现此目标,因为您可以在每行达到第十个配额时轻松添加和删除数字。

#include <fstream>
#include <deque>
#include <numeric>

int main()
{
    std::ifstream read("average.txt");

    constexpr unsigned linesToAverage = 10;
    std::deque<double> numbers;
    double currentNumber = 0.0;

    while (read >> currentNumber) {
        if (numbers.size() == linesToAverage) {
            std::cout << std::accumulate(std::begin(numbers), std::end(numbers), 0.0) / linesToAverage << std::endl;
            numbers.pop_back();
        }

        numbers.push_front(currentNumber);
    }

    return 0;
}

此代码显示从前十个数字开始的平均值。