Поменять максимальное и минимально значение местами в текстовом файле

#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
→ Ссылка