Поменять максимальное и минимально значение местами в текстовом файле
#include <fstream>
#include <iostream>
#pragma warning(disable : 4996)
using namespace std;
int main() {
setlocale(LC_ALL, "RUS");
int n;
double a;
cout << "n = ";
cin >> n;
double * b = new double[n];
FILE * f; //описываем файловую переменную
//создаем двоичный файл в режиме записи
f = fopen("myFile.txt", "w+b");
//ввод числа n
fwrite(&n, sizeof(int), 1, f);
//цикл для ввода n вещественных чисел
for (int i = 0; i < n; i++) {
//ввод очередного вещественного числа
cout << "a =";
cin >> a;
//запись вещественного числа в двоичный файл
fwrite(&a, sizeof(double), 1, f);
}
fseek(f, 0, SEEK_SET);
fread(&n, sizeof(int), 1, f);
//вывод n на экран
cout << "n = " << n << endl;
//выделение памяти для массива из n чисел
//чтение n вещественных чисел из файла в массив a
fread(b, sizeof(double), n, f);
//вывод массива на экран
for (int i = 0; i < n; i++)
cout << b[i] << "\t";
cout << endl;
//закрываем файл
fclose(f);
system("pause");
return 0;
}
Ответы (2 шт):
Автор решения: Павел Ериков
→ Ссылка
Ну если я вас правильно понял, то когда мы вводим числа сначала нам нужно найти максимальный и минимальный элемент, а так же их индексы.
Вот пример:
//цикл для ввода n вещественных чисел
int minIndex = 0, maxIndex = 0;
double min = DBL_MAX, max = DBL_MIN;
for (int i = 0; i < n; i++)
{
//ввод очередного вещественного числа
cout << "a = ";
cin >> a;
if (a < min) {
min = a;
minIndex = i;
}
if (a > max) {
max = a;
maxIndex = i;
}
//запись вещественного числа в двоичный файл
fwrite(&a, sizeof(double), 1, f);
}
А дальше меняем местами элементы, вот пример замены:
//Устанавливаем указатель потока относительно начала файла на начало
//минимального числа со смещением int (первое число у нас n)
fseek(f, minIndex * sizeof(double) + sizeof(int), SEEK_SET);
//Записываем на место минимального элемента, максимальный элемент
fwrite(&max, sizeof(double), 1, f);
//Так же устанавливаем указатель на максимальный индекс со смещением
fseek(f, maxIndex * sizeof(double) + sizeof(int), SEEK_SET);
//записываем на место максимального элемента, минимальный
fwrite(&min, sizeof(double), 1, f);
Автор решения: Arty
→ Ссылка
Пример кода, используя функции стандартной C++ библиотеки.
У меня в коде входной и выходной файлы названы 0446.inp и 0446.out, переименуйте если надо, также если надо выходной файл можно назвать также как входной, чтобы перезаписать поверх.
#include <algorithm>
#include <fstream>
#include <vector>
#include <stdexcept>
#include <iostream>
#include <iterator>
int main() {
try {
std::vector<int> nums;
{
std::ifstream ifs("0446.inp");
std::copy(
(std::istream_iterator<int>(ifs)),
std::istream_iterator<int>(),
std::back_inserter(nums)
);
}
if (nums.empty())
return 0;
auto it_min = std::min_element(nums.begin(), nums.end());
auto it_max = std::max_element(nums.begin(), nums.end());
std::cout << "Min: " << *it_min << ", Max: " << *it_max << std::endl;
std::swap(*it_min, *it_max);
{
std::ofstream ofs("0446.out");
for (auto n: nums)
ofs << n << std::endl;
}
return 0;
} catch (std::exception const & ex) {
std::cout << "Exception: " << ex.what() << std::endl;
return -1;
}
}
Входной файл:
15
12
17
300
200
250
Выходной файл:
15
300
17
12
200
250
Вывод в консоль:
Min: 12, Max: 300