代码之家  ›  专栏  ›  技术社区  ›  introvertbustardxd

从txt文件中汇总,然后平均每10行

  •  1
  • introvertbustardxd  · 技术社区  · 7 年前

    我为标题中提到的任务编写了以下代码:

    该程序从一个单列文本文件中读取数据,其中的数字彼此低于。

    #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 回复  |  直到 7 年前
        1
  •  1
  •   petrpulc    7 年前

    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;
    }
    
        2
  •  0
  •   pmaxim98    7 年前

    你可以用一个 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;
    }