2017-08-23 50 views
1

我对在标题中提到的任务的代码:汇总每隔10行平均从txt文件

该程序从其中的数字是在下面彼此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

学习时间[如何调试小程序](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)。 – StoryTeller

+1

“while”和“for”的顺序看起来不对。您正在读取1个数字,并在for循环中使用该数字10次。 – ikkuh

+0

因为我知道'while(average >> number)'和'while(!average.eof())'''getline'相同' – introvertbustardxd

回答

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; 
} 
+0

https://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong –

+0

@RetiredNinja打字比想当然快,当然 – petrpulc

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; 
} 

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