Сортировка Fstream - один пробел не требуется

Итак, по сути, я сделал довольно простой код, который помещает ряд чисел из списка input.txt в два выходных файла, один для четных чисел, а другой для нечетных чисел. Это действительно работает. Проблема в том, что я сделал это так, что после каждого числа, отсортированного в конкретный файл, он добавляет пустой пробел char, чтобы следующий номер, отсортированный в этот список, мог быть исключен из предыдущего. Опять же, это тоже работает. Тем не менее, мне не нужен пробел после последнего числа, отсортированного в каждом списке, поскольку следующего числа нет. Я попытался исправить это, используя строку if 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<<" ";
                }
        }
}

person user3686829    schedule 29.05.2014    source источник
comment
Не использовать std::istream::eof()? Он не делает того, о чем вы думаете. Ваш основной цикл должен быть просто while ( f >> aux ).... И, как говорит Роберто Реал в своем ответе, решение состоит в том, чтобы вывести разделитель перед числом, а не после. Если вы сначала не создадите данные в памяти (например, используя два std::vector<int>), вы не сможете знать, что достигли конца, пока не произойдет сбой ввода. (Также: почему все ваши переменные глобальные? Они должны быть локальными.)   -  person James Kanze    schedule 29.05.2014


Ответы (1)


Просто вставляйте пробел перед каждой новой записью, за исключением, конечно, первой.

Кроме того, как отмечено в комментариях, условие f>>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 = " ";
        }
    }
}
person Roberto Reale    schedule 29.05.2014
comment
Конечно, условие цикла неверно и, вероятно, приведет к тому, что последняя запись будет обработана дважды. - person James Kanze; 29.05.2014
comment
И код содержит неопределенное поведение, поскольку он использует результаты >> без проверки его успешности. Что не так с обычным while ( f >> aux )...? - person James Kanze; 29.05.2014
comment
Повторите редактирование: это больше, чем просто предпочтение: отсутствие проверки на успех после f >> aux является ошибкой. Если это вопрос предпочтения ... Переменные должны быть локальными, он должен проверить, что открытие прошло успешно, он должен проверить наличие ошибок после закрытия выходных файлов (и после сбоя ввода), а возвращаемое значение main должно зависеть от была ли ошибка или нет. - person James Kanze; 29.05.2014