【问题标题】:Fstream sorting - One space char not neededFstream 排序 - 不需要一个空格字符
【发布时间】:2014-05-29 08:59:05
【问题描述】:

所以,基本上,我编写了一个非常简单的代码,将 input.txt 列表中的一系列数字放入两个输出文件,一个用于偶数,另一个用于奇数。 它确实有效。问题是我已经做到了,因此在将每个数字排序到特定文件之后,它会添加一个空格字符,以便排序到该列表中的下一个数字可以与前一个数字区别开来。同样,这也确实有效。尽管如此,我不需要在每个列表中排序的最后一个数字之后使用空格字符,因为没有下一个数字。 我试图通过使用 如果 f.eof 行,尽管这只适用于最后一个数字被排序到的列表。另一个列表仍然有空格字符。任何想法如何解决它?

#include<fstream>
using namespace std;

fstream f;
fstream g;
fstream h;
int aux;

int main()
{
    f.open("input.txt");
    g.open("output1.txt");
    h.open("output2.txt");
    while(!f.eof())
        {
            f>>aux;

            if(f.eof())
                {
                    if(aux%2==0)
                        g<<aux;
                    else
                        h<<aux;
                }
            else
                {
                    if(aux%2==0)
                        g<<aux<<" ";
                    else
                        h<<aux<<" ";
                }
        }
}

【问题讨论】:

  • 不要使用std::istream::eof()?它不会像你想的那样做。你的主循环应该只是while ( f &gt;&gt; aux )...。正如 Roberto Real 在他的回答中所说,解决方案是输出分隔符 before 数字,而不是之后。除非您首先在内存中创建数据(例如,使用两个 std::vector&lt;int&gt;),否则您无法知道您已经到达终点,直到输入失败。 (另外:为什么你所有的变量都是全局的?它们应该是本地的。)

标签: c++ fstream


【解决方案1】:

只需在每个新条目之前插入空格,当然不包括第一个。

此外,如 cmets 中所述,f&gt;&gt;aux 条件在 while 中是首选的。

#include<fstream>
using namespace std;

fstream f;
fstream g;
fstream h;

int aux;

string g_sep, h_sep;

int main()
{
  f.open("input.txt");
  g.open("output1.txt");
  h.open("output2.txt");

  while(f>>aux)
    {
      if(aux%2==0)
        {
          g<<g_sep;
          g<<aux;
          g_sep = " ";
        }
      else
        {
          h<<h_sep;
          h<<aux;
          h_sep = " ";
        }
    }
}

【讨论】:

  • 当然循环条件不对,很可能会导致最后一个条目被处理两次。
  • 并且代码包含未定义的行为,因为它使用&gt;&gt; 的结果而不检查它是否成功。平时的while ( f &gt;&gt; aux )...怎么了?
  • 重新编辑:这不仅仅是首选:在f &gt;&gt; aux 之后不检查成功是一个错误。如果是首选的问题...变量应该是本地的,他应该检查打开是否成功,他应该在关闭输出文件后(以及输入失败后)检查错误,main 的返回值应该取决于是否有错误。
猜你喜欢
  • 1970-01-01
  • 2010-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2021-02-20
  • 2019-12-15
  • 2018-10-24
相关资源
最近更新 更多