1

我必须用 C++ 编写一个程序,该程序将从文本文件中读取并计算每行的总数。文本文件看起来像这样

2
14.4 56.9 54 65.7 86.9
98.6 84.9 34.7 85.5 15.4
24.4 57.9 54.9 70.7 63.5

34.4 16.9 41.9 54.7 84.98
97.6 84.9 14.7 85.5 16.4
23.4 76.9 54.9 74.7 64.5

第一行是周数。接下来的行有五个双打(每周 3 行)。并且它将重复第一行中给出的周数。到目前为止,我有这个代码来计算每周的总数。不知怎的,它给了我 0 作为每周之前的总数

string s; 
 double sum[4]; 

 for(int j = 0; j < weeks; j++)
   {
       for(int i = 0; i <= 3 && getline(in, s); i++)
         {
            istringstream sin(s);
            sum[i] = 0;
            while (sin>>sales)
            {
               sum[i] = sum[i] + sales;
            }
            cout << sum[i] << endl;
         } 
    }

结果如下:

0
277.9
319.1
271.4
0
232.88
299.1
294.4

有人能告诉我为什么我得到那个 0 吗?另外,我应该如何将每行的数字存储为总数。行数会因周数而异。请有人帮忙!

4

3 回答 3

2

您正在对每组之间的空白行的数字求和。由于这些线上没有数字,因此总和当然保持为零。我还假设您没有阅读整个第一行以获得周数,因此那里也有一个前导零。要解决这个问题,只需在每周开始之前多读一行,如下所示:

string s; 
double sum[4]; 

for(int j = 0; j < weeks; j++)
{
    getline(in, s);
    for(int i = 0; i < 3 && getline(in, s); i++)
    {
        istringstream sin(s);
        sum[i] = 0;
        while (sin>>sales)
        {
           sum[i] = sum[i] + sales;
        }
        cout << sum[i] << endl;
    }
    cout << endl;
 }

输出是:

277.9
319.1
271.4

232.88
299.1
294.4
于 2013-11-12T18:07:25.357 回答
1

检查它是否不是这样的空行:

 if (!s.empty())
 {
     cout << sum[i] << endl;
 }
于 2013-11-12T18:16:10.170 回答
0

我认为问题在于使用运算符>>读取了周数。之后,下一个 getline 调用读取一个空字符串。它将解释第一个零。我还看到两个三行之间有一条空线。因此,您似乎再次阅读了一个空行。除此之外,我不明白你为什么使用循环

for(int i = 0; i <= 3 && getline(in, s); i++)

如果一周只有三行。

因此,您需要检查是否读取了空行。

于 2013-11-12T18:09:14.873 回答