Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проблема с потоковым выводом 
:(
    Опции темы
ALI46
Дата 5.5.2008, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



Компоненты типизированного файла – целые числа. Удалить из этого файла все положительные числа, кратные 3, добавив в конец файла их количество.
написал код
Код

#include <iostream.h>
#include <fstream.h>
class chisl
{
    public:
    int create()
    {
        ofstream fin("in.dat.txt", ios::out| ios::binary);
        if (!fin)
        {
            cout<<"ERROR!!!"<<endl;
            return 1;
        }
        int N=0;
        cout<<"Enter quantity of elements"<<endl;
        cin>>N;
        int i=0;
        int n=0;
        while (i<N)
        {
            cout<<"Enter "<<i+1<<" array's element"<<endl;
            cin>>n;
            fin<<n<<" ";
            i++;
        }
        fin.close();
    }
    int run()
    {
        ifstream fout1("in.dat.txt", ios::in| ios::binary);
        ofstream fout2("out.dat.txt", ios::out| ios::binary);
        if (!fout1||!fout2)
        {
            cout<<"ERROR!"<<endl;
            return 1;
        }
        int n;
        //int i=0;
        int k=0;
        while (fout1)
        {
            fout1>>n;
            if(n%3==0&&n>0)
            {
                fout2<<"";
                k++;
            }
            else fout2<<n<<",";
        }
        fout2 << k;
        fout1.close();
        fout2.close();
    }
}h;
   
void main(void)
{
    h.create();
    h.run();
}


но когда вводишь числа то после обработки в файл выводится два раза последний элемент(в случае если он не попалдает под условия удаления), а если он попадает под условия удаления, то количество удалённых чисел становится на один больше, т.е. последний удаляемый элемент два раза считается.
Подскажите пожалуйста в чём причина и как её избежать?

Это сообщение отредактировал(а) ALI46 - 5.5.2008, 22:12
PM MAIL   Вверх
Rififi
Дата 5.5.2008, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



ALI46, 
твой код не смотрел, я бы сделал примерно так:

Код
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
#include <functional>
#include <iterator>
#include <stdexcept>

// Реализация условия: положительные числа, кратные 3
struct pos_div_3 : public std::unary_function<int, bool>
{
    pos_div_3(size_t& count) : count_(count) {}
    result_type operator()(const argument_type& v) const
    {
        count_++;
        return (v > 0) && (v % 3 == 0);
    }
    mutable size_t& count_;
};

void remove_from_file(const std::string& fileName)
{
    std::ifstream ifs(fileName.c_str(), std::ios_base::in);
    if (!ifs)
        throw std::runtime_error(fileName);

    // массив, где будем хранить результат отсеивания
    typedef std::vector<int> V;
    V v;
    
    // Общее количество прочитанных чисел из файла
    size_t allNumbers = 0;
    
    // готовим список чисел, удовлетворяющих условию
    std::remove_copy_if(
        std::istream_iterator<int>(ifs),
        std::istream_iterator<int>(),
        std::back_inserter(v), pos_div_3(allNumbers));
    ifs.close();
    
    // количество отсеянных чисел
    size_t nums = allNumbers - v.size();

    // Запись отсеянного списка + количество отсеянных чисел обратно в файл
    std::ofstream ofs(fileName.c_str(), std::ios_base::out);
    if (!ofs)
        throw std::runtime_error(fileName);

    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(ofs, " "));
    ofs << std::endl << nums << std::endl;
}

PM MAIL   Вверх
ALI46
Дата 5.5.2008, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



Rififi, дело в том что мне надо сделать это не пользуясь шаблонами(((
PM MAIL   Вверх
Rififi
Дата 5.5.2008, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1254
Регистрация: 9.3.2008

Репутация: 11
Всего: 36



ALI46, 
может, лучше намекнёшь преподу, что ты не намерен тратить своё время для того чтобы угодить ему с этими дурацкими ограничениями? :gigi:

Добавлено через 1 минуту и 41 секунду
PS. кстати потоки - в основе своей это тоже шаблонные классы :grin:
PM MAIL   Вверх
ALI46
  Дата 5.5.2008, 22:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 37
Регистрация: 1.5.2008

Репутация: нет
Всего: нет



Rififi, я боюсь, что в таком случае он намекнёт мне на то, что он не намерен тратить своё время на студентов которые не могут прочитать задание и сделать именно как там написано)))))
на самом деле, неужели нельзя никак убрать из потока один элемент который непонятно почему дублируется?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0507 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.