Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.11.2020, 13:05   #1
Александр222
Пользователь
 
Регистрация: 15.04.2020
Сообщений: 59
Вопрос C++ Удаляется старое значение в файле

В коде я расписал функции: File(), Modify() и Add_Sum_Avarage(). File() должна заполнять файл числами, Modify() делает некоторую модификацию(у меня умножает на -1, если число отрицательное), Add_Sum_Avarage() высчитывает сумму всей последовательности, находит среднее арифметическое(эти числа добавляются в конец контейнера), находит максимум и минимум и высчитывает среднее арифметическое между ними, потом добавляет это среднее к каждому элементу последовательности.

Проблема заключается в том, что когда в main пишу сначала

Код:
           File(50, 5);
           std::deque<double> D = inputfile_to_deque();
           Modify(D);
           Add_Sum_Avarage(D);
выводится Modify() и Add_Sum_Avarage().
Когда пишу
Код:
 
           File(50, 5);
           std::deque<double> D = inputfile_to_deque();
           Add_Sum_Avarage(D);
           Modify(D);
выводится только Modify(). В чем проблема? Должно выводится все File(), Modify() и Add_Sum_Avarage().

Код:
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
#include <vector>
#include <deque>
#include <list>
#include <algorithm>
#include <iterator>
#include <cmath>

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!" << std::endl;
}

std::vector<double> inputfile_to_vector() {
	std::vector<double> vec;

	std::fstream in("input.txt", std::fstream::in | std::fstream::out);

	if (!in.is_open()) std::cout << "Cannot open file!\n";
	else {
		for (int x; in >> x; ) {
			vec.push_back(x);
		}
	}
	return vec;
}

std::deque<double> inputfile_to_deque() {
	std::deque<double> deq;

	std::fstream in("input.txt", std::fstream::in | std::fstream::out);

	if (!in.is_open()) std::cout << "Cannot open file!\n";
	else {
		for (int x; in >> x; ) {
			 deq.push_back(x);
		}
	}	
	return deq;
}

std::list<double> inputfile_to_list() {
	std::list<double> list;

	std::fstream in("input.txt", std::fstream::in | std::fstream::out);

	if (!in.is_open()) std::cout << "Cannot open file!\n";
	else {
		for (int x; in >> x; ) {
			list.push_back(x);
		}
	}
	return list;
}

template <class T>
T& Modify(T& X) {

	std::ofstream out("input.txt");
	
	typename T::iterator p;
	
	for (auto& i : X) {
		if (i < 0) {
			i *= -1;
		}
		out << i << " ";
	}
	return X;
}

template <class T>
 void Add_Sum_Avarage(T& conteiner) {
	std::ofstream out("input.txt");

	typename T::iterator pos;
	typename T::iterator pos1;
	typename T::iterator pos2;

	int MAX = 0;
    int MIN = 0;	
	int S = 0, N = 0;
	double SA = 0;
	for (const auto& i : conteiner) out << i << std::endl;
	for (pos = conteiner.begin(); pos != conteiner.end(); ++pos) {
	    S += *pos;
		SA += *pos;
		N++;
	}	
	conteiner.push_back(S);
	conteiner.push_back(SA / N);
   
	out << "\nSum of container = " << S << std::endl;
	out << "Average of container = " << (SA / N) << std::endl;

	for (pos1 = conteiner.begin(); pos1 != conteiner.end(); ++pos1)
		if (MAX < *pos1) MAX = *pos1; out << "\nMAX = " << MAX << std::endl;

	for (pos2 = conteiner.begin(); pos2 != conteiner.end(); ++pos2)
		if (MIN > * pos2) MIN = *pos2; out << "MIN = " << MIN << std::endl;

	double Avarage = (MAX + MIN) / 2.0;
	out << "Avarage of max and min = " << Avarage << '\n' << std::endl;

	for (const auto& i : conteiner) out << (i + std::abs(Avarage)) << std::endl;	
}

int Random() { return rand() % (2 * 50 + 1) - 50; }

int main(){
	
	srand(time(NULL));
	
	File(50, 5);
	
	std::cout << "Making of container..." << std::endl;	
	std::vector<double> V = inputfile_to_vector();
	std::deque<double> D = inputfile_to_deque();
	std::list<double> L = inputfile_to_list();
	
	std::cout << "Changing of container..." << std::endl;	

	Modify(D);
	Add_Sum_Avarage(D);
}

Последний раз редактировалось Александр222; 05.11.2020 в 13:14.
Александр222 вне форума Ответить с цитированием
Старый 05.11.2020, 14:06   #2
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,044
По умолчанию

Александр222, ну так каждый раз открываешь и очищаешь файл
Код:
std::ofstream out("input.txt");
передавай ссылку на уже открытый
Код:
std::ofstream
. Заодно уйдёт косяк с размазыванием имени файла по всему коду
Алексей1153 вне форума Ответить с цитированием
Старый 05.11.2020, 14:30   #3
Александр222
Пользователь
 
Регистрация: 15.04.2020
Сообщений: 59
По умолчанию

Цитата:
Сообщение от Алексей1153 Посмотреть сообщение
передавай ссылку на уже открытый
Спасибо. А как это можно сделать? В универе просто еще этого не было.
Александр222 вне форума Ответить с цитированием
Старый 05.11.2020, 14:32   #4
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,044
По умолчанию

Код:
void File(std::ofstream& out,int N, int count)
{
	if(!out.is_open())return;

	for (int i = 1; i <= count; ++i) {
		out << rand() % (2 * N + 1) - N << std::endl;
	}
	out << "File is done!" << std::endl;
}
Алексей1153 вне форума Ответить с цитированием
Старый 05.11.2020, 14:57   #5
Александр222
Пользователь
 
Регистрация: 15.04.2020
Сообщений: 59
По умолчанию

Алексей1153, Спасибо!
Александр222 вне форума Ответить с цитированием
Старый 05.11.2020, 20:09   #6
Александр222
Пользователь
 
Регистрация: 15.04.2020
Сообщений: 59
По умолчанию

Алексей1153, А не подскажите, как я могу передать файл в аргумент функций?
я пишу
Код:
std::deque<int> inputfile_to_deque(std::ofstream& File)
Тогда что мне надо написать в main?
Код:
std::deque<int> D = inputfile_to_deque(File); //?
Александр222 вне форума Ответить с цитированием
Старый 06.11.2020, 07:24   #7
Алексей1153
фрилансер, препод.
Участник клуба
 
Регистрация: 11.10.2019
Сообщений: 1,044
По умолчанию

примерно так

Код:
//открываем файл на запись
std::ofstream out("input.txt");

//три раза пишем
File(out,50, 5);
File(out,50, 5);
File(out,50, 5);
Алексей1153 вне форума Ответить с цитированием
Старый 06.11.2020, 08:59   #8
Александр222
Пользователь
 
Регистрация: 15.04.2020
Сообщений: 59
По умолчанию

Алексей1153, Спасибо!
Александр222 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
А что если Все измененный данные буду дописываться в конец файла, а их старое место в файле будет затираться пробелами ? tae1980 SQL, базы данных 15 28.03.2018 00:01
вычислить значение в файле и дописать ответ СанекКенас Помощь студентам 1 11.02.2015 11:54
заезженное старое, но оч надо sha69 Microsoft Office Excel 9 23.11.2011 20:31
Заменить старое значение на новое D.O.G БД в Delphi 11 01.09.2010 09:46