Удаление элементов в файле

178
21 апреля 2022, 17:10

Есть код, в котором генерируются последовательности и помещаются в input.txt. В output.txt. с этими последовательностями происходит модификация. Суть в том, что при новом открытии файла, старые значения должны удаляться. То есть, я запускаю код, получаю последовательности. Далее запускаю код во второй раз, и в файлах должны быть уже новые. В input.txt это работает. А в output.txt при каждом новом выполнении программы и дальнейшем открытии файла, все элементы помещаются вместе со старыми. Что не так?

#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <vector>
#include <deque>
#include <list>
#include <algorithm>
#include <iterator>
#include <cmath>
 
double Avarage;
double Avarage1;
double Avarage2;
 
void File(int N, int count){
    std::ofstream out("input.txt");
 
    for (int i = 1; i <= count; ++i) {
        out << rand() % (2 * N + 1) - N << std::endl;
    }
    out << "File is done!\n" << std::endl;
}
 
template <typename Container>
Container inputfile(const std::string& File){
    std::fstream in(File);
 
    Container cont;
 
    if (!in.is_open()) std::cout << "Cannot open file!\n";
    else {
        for (int x{}; in >> x; ) {
            cont.push_back(x);
        }
    }
    return cont;
}
 
template <class T>
void Add_Sum_Avarage(T& conteiner) {
    std::ofstream out("output.txt", std::ofstream::app);
    
    typename T::iterator it0;
    typename T::iterator it2;
    double S = 0;
    double N = 0;
 
    for (it0 = conteiner.begin(); it0 != conteiner.end(); ++it0) {
        S += *it0;
        N++;
    }
 
    conteiner.push_back(S);
    conteiner.push_back(S / N); 
    for (it2 = conteiner.begin(); it2 != conteiner.end(); ++it2)  out << *it2 << std::endl;
    out << "Sum of container = " << S << std::endl; //сумма всех чисел в контейнере
    out << "Average of container = " << (S / N) << std::endl; //среднее арифметичиское всех чисел в контейнере
}
 
template <class T>
T& Modify(T& container) {
    std::ofstream out("output.txt", std::ofstream::app);
    
    out << "\nModify:" << std::endl;
    typename T::iterator it1;
    typename T::iterator it2;
    double MAX = 0;
    double MIN = 0;
 
    for (it1 = container.begin(); it1 != container.end(); ++it1)
        if (MAX < *it1) MAX = *it1; out << "MAX = " << MAX << std::endl; //поиск максимального числа в контейнере
    for (it2 = container.begin(); it2 != container.end(); ++it2)
        if (MIN > *it2) MIN = *it2; out << "MIN = " << MIN << std::endl; //поиск минимального числа в контейнере
 
    double Avarage = (MAX + MIN) / 2.0;
    out << "Avarage of max and min = " << Avarage << std::endl;
    for (const auto& i : container) out << i + std::abs(Avarage) << std::endl;
 
    return container;
}
 
template<class T>
T& Modify2(T& conteiner, typename T::iterator& it3, typename T::iterator& it4) {
    std::ofstream out("output.txt", std::ofstream::app);
    
    out << "\nModify(iterator):" << std::endl;
    double MAX = 0;
    double MIN = 0;
 
    for (it3 = conteiner.begin(); it3 != conteiner.end(); ++it3)
        if (MAX < *it3) MAX = *it3;   out << "MAX = " << MAX << std::endl;//поиск максимального числа в контейнере
    for (it4 = conteiner.begin(); it4 != conteiner.end(); ++it4)
        if (MIN > *it4) MIN = *it4;  out << "MIN = " << MIN << std::endl;//поиск минимального числа в контейнере
 
    double Avarage = (MAX + MIN) / 2.0; 
    out << "Avarage of max and min = " << Avarage << std::endl;
    for (const auto& i : conteiner) out << i + std::abs(Avarage) << std::endl;
 
    return conteiner;
}
 
 template <class T>
 void outfile(T& Container) {
     std::ofstream out("output.txt", std::ofstream::app);
    
     typename T::iterator it3;
     for (it3 = Container.begin(); it3 != Container.end(); ++it3) {
         out << *it3 << std::endl;
     }
     std::cout << "File output" << std::endl;
 }
 
 int Random() { return (std::rand() % 51); }
 double AvarageSum1(double& i1) { return i1 += Avarage1; }
 double AvarageSum2(double& i2) { return i2 += Avarage2; }
 
int main(){ 
    std::ofstream out("input.txt", std::ofstream::app);
    std::ofstream out2("output.txt", std::ofstream::app);
 
    srand(signed (std::time(0)));
 
    File(50, 5);     
    
    std::cout << "Making of container..." << std::endl; 
    std::vector<double> V = inputfile<std::vector<double>>("input.txt");
    std::deque<double> D = inputfile<std::deque<double>>("input.txt");
    std::list<double> L = inputfile<std::list<double>>("input.txt");
    
    std::cout << "Changing of container..." << std::endl;   
    std::deque<double>::iterator itt3;
    std::deque<double>::iterator itt4;
    Add_Sum_Avarage(D);
    Modify(D);
    Modify2(D, itt3, itt4); 
    
 
    std::cout << "Making and changing  of container with the help of methods" << std::endl;
    std::vector<double> v_each (5);
    std::vector<double>::iterator pos1;
    out << "Generate()" << std::endl;
    std::generate(v_each.begin(), v_each.end(), Random);
    bool flag1 = false;
    for (pos1 = v_each.begin(); pos1 != v_each.end(); ++pos1) { 
        auto minmax = std::minmax_element(v_each.begin(), v_each.end());
        Avarage1 = ((*minmax.first + *minmax.second) / 2.0);
        if (!flag1) {
            out << "MAX = " << *minmax.second << std::endl;
            out << "MIN = " << *minmax.first << std::endl;
            out << "Avarage = " << Avarage1 << std::endl;
            flag1 = true;
        }
        out << *pos1 << std::endl;
    }   
    out2 << "\nChanging  of container with the help of method for_each()" << std::endl;
    std::for_each(v_each.begin(), v_each.end(), AvarageSum1);
    outfile(v_each);
 
 
    std::list<double> v_transform (5);
    std::list<double>::iterator pos2;
    out << "\nGenerate()" << std::endl;
    std::generate(v_transform.begin(), v_transform.end(), Random);
    bool flag2 = false;
    for (pos2 = v_transform.begin(); pos2 != v_transform.end(); ++pos2) {
        auto minmax = std::minmax_element(v_transform.begin(), v_transform.end());
        Avarage2 = ((*minmax.first + *minmax.second) / 2.0);
        if (!flag2) {
            out << "MAX = " << *minmax.second << std::endl;
            out << "MIN = " << *minmax.first << std::endl;
            out << "Avarage = " << Avarage2 << std::endl;
            flag2 = true; 
        }
        out << *pos2 << std::endl;
    }   
    out2 << "\nChanging  of container with the help of method transform()" << std::endl;
    std::transform(v_transform.begin(), v_transform.end(), v_transform.begin(), AvarageSum2);
    outfile(v_transform);
}
READ ALSO
Стоит ли когда либо использовать #include &lt;bits / stdc ++.h&gt;?

Стоит ли когда либо использовать #include <bits / stdc ++.h>?

я вот только не давно узнал про заголовочный файл #include <bits / stdc ++H> и зачал искать информацию по этой библиотеке

108
Как вывести двумерный массив корректно?

Как вывести двумерный массив корректно?

Пусть дано:Заполнить массив

121
Конструкторы и операторы копирования и перемещения наследуемого класса

Конструкторы и операторы копирования и перемещения наследуемого класса

Мой вопрос заключается в том, правильно ли реализована логика копирования и перемещения конструкторов и операторов наследуемого класса

134
Как наиболее точно измерить потребляемую программой память?

Как наиболее точно измерить потребляемую программой память?

Как наиболее точно измерить потребляемую программой память?

129