【问题标题】:C++ Reading from a text file and calculating total for each line:C++ 从文本文件中读取并计算每一行的总数:
【发布时间】:2013-11-25 00:48:12
【问题描述】:

我必须用 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 吗?另外,我应该如何将每行的数字存储为总数。行数会因周数而异。请有人帮忙!

【问题讨论】:

  • 您可以使用以下模块:code.google.com/p/inih
  • 你总是可以尝试调试它。为什么不在 sum 循环的顶部显示“s”?循环条件等简单的事情很容易出错,所以中间的本地人和大量的显示调用是你的朋友,(如果不是真正的调试器:)
  • 主要问题是空行。您确定要使用getline 吗?对于这个问题,流输入会简单很多,但也许你的目标是学习使用getline...
  • 这看起来像是家庭作业。我相信老师给了你一本书供你阅读。

标签: c++ io computer-science ifstream


【解决方案1】:

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

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

【讨论】:

  • 这有助于摆脱 0。我必须在单独的文本文件中输出每行的总数和平均值。我应该如何存储总数?像在循环内部还是在外部?这种特殊情况总共有 6 个,但会根据周数(周 * 3)有所不同。任何有关这方面的线索将不胜感激。并感谢上面的帮助!
  • 每行正好有 5 个部分,对吧? (问题说明了这一点)当您完成每一行时,在 while 循环结束后立即输出总和(您已经拥有)和平均值(总和 / 5)。
【解决方案2】:

检查它不是这样的空行:

 if (!s.empty())
 {
     cout << sum[i] << endl;
 }

【讨论】:

    【解决方案3】:

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

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

    如果一周只有三行。

    所以你需要检查是否读取了一个空行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-22
      • 1970-01-01
      相关资源
      最近更新 更多