Дан файл целых чисел. Получить новый файл, в котором располагаются сначала все совершенные элементы, а потом остальные

Рейтинг: 0Ответов: 1Опубликовано: 08.05.2023
    bool sov(int x)
    {
        int s = 0;
        for (int i = 1; i < x; i++)
        {
            if (x % i == 0) s += i;
        }
        if (s == x) return true;
else return false;
        
    }
    int main()
    {
        int n, x;
        ofstream f("f.txt");
        cout << "Enter kol-vo" << endl;
        cin >> n;
        for (int i = 0; i < n; i++)
        {
            cout << "Enter elem" << endl;
            cin >> x;
            f << x << endl;
        }
        f.close();
        cout << "File:";
        ifstream h;
        h.open("f.txt");
        ofstream g("g.txt");
        while (!h.eof())
        {
            h >> x;
            if (!h.eof()) {
                if (sov(x))
                    g << x << endl;
                
            }
            }
        h.seekg(0, ios::beg); //пробовала без этой строчки
        while (!h.eof())
        {
            h >> x;
            if (!h.eof()) {
                if (!sov(x))
                    g << x << endl;
    
            }
        }
        h.close();
        g.close();
        h.open("g.txt");
        while (!h.eof())
        {
            h >> x;
            if (!h.eof()) cout << x << " ";
        }
        h.close();
    }

Написала программу, но она выводит только совершенные числа, а остальные нет. Не понимаю в чем проблема, подскажите пожалуйста как довести программу до рабочего состояния?

Ответы

▲ 3Принят

Да все просто: после первого чтения файл заходит в состояние fail, и ему надо сбросить это состояние...

h.clear();
h.seekg(0, ios::beg); //пробовала без этой строчки
while (!h.eof())

Видите это h.clear()?

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

#include <vector>
#include <fstream>
#include <iostream>

using namespace std;

bool sov(unsigned long long x)
{
    static unsigned long long sn[] =
    { 6, 28, 496, 8128, 33550336, 8589869056, 137438691328 };
    for(auto s: sn)
        if (s == x) return true;
    return false;
}

int main()
{
    {
        unsigned long long n, x;
        ofstream f("f.txt");
        cout << "Enter kol-vo" << endl;
        cin >> n;
        for (unsigned long long i = 0; i < n; i++)
        {
            cout << "Enter elem" << endl;
            cin >> x;
            f << x << endl;
        }
    }

    {
        ifstream h("f.txt");
        ofstream g("g.txt");
        vector<unsigned long long> perf, nperf;
        for(unsigned long long x ;h >> x;)
            if (sov(x)) perf.push_back(x);
            else nperf.push_back(x);
        for(auto x: perf) g << x << endl;
        for(auto x: nperf) g << x << endl;
    }

    {
        ifstream h("g.txt");
        for(unsigned long long x ;h >> x;)
            cout << x << endl;
    }
}