/*
Гусятинер Л.Б. & 302ИС-23, 18.05.2026
выгрузить в массив и выгрузить обратно
размер массива = размеру бинарника
*/
#include <stdio.h>
#include <stdlib.h>
#define SZ_INT sizeof(int)
int main(void) {
char *txt_name = "in.txt";
char *bin_name = "in.bin";
FILE *f_txt = fopen(txt_name, "r");
if (!f_txt) {
printf("Ошибка открытия %s\n", txt_name);
return 1;
}
FILE *f_bin = fopen(bin_name, "wb");
if (!f_bin) {
printf("Ошибка открытия %s\n", bin_name);
fclose(f_txt);
return 1;
}
// Чтение из текстового файла и запись в бинарный
int num;
while (fscanf(f_txt, "%d", &num) == 1) {
fwrite(&num, SZ_INT, 1, f_bin);
}
fclose(f_txt);
fclose(f_bin);
// Открытие бинарного файла для чтения и сортировки
f_bin = fopen(bin_name, "r+b");
if (!f_bin) {
printf("Ошибка открытия %s\n", bin_name);
return 1;
}
// Определение количества элементов
fseek(f_bin, 0, SEEK_END);
long size = ftell(f_bin);
int total = (int)(size / SZ_INT);
if (total == 0) {
printf("Файл пуст\n");
fclose(f_bin);
return 0;
}
// Сортировка выбором прямо в файле
for (int i = 0; i < total - 1; i++) {
int imin = i;
int min_val;
// Читаем текущий элемент как минимальный
fseek(f_bin, imin * SZ_INT, SEEK_SET);
fread(&min_val, SZ_INT, 1, f_bin);
// Поиск минимального элемента в оставшейся части
for (int j = i + 1; j < total; j++) {
int cur;
fseek(f_bin, j * SZ_INT, SEEK_SET);
fread(&cur, SZ_INT, 1, f_bin);
if (cur < min_val) {
min_val = cur;
imin = j;
}
}
// Обмен элементов, если найден новый минимум
if (i != imin) {
int val_i;
// Читаем значение на позиции i
fseek(f_bin, i * SZ_INT, SEEK_SET);
fread(&val_i, SZ_INT, 1, f_bin);
// Записываем val_i на место минимума
fseek(f_bin, imin * SZ_INT, SEEK_SET);
fwrite(&val_i, SZ_INT, 1, f_bin);
// Записываем min_val на место i
fseek(f_bin, i * SZ_INT, SEEK_SET);
fwrite(&min_val, SZ_INT, 1, f_bin);
}
}
// Вывод отсортированных чисел
printf("Отсортированные числа:\n");
rewind(f_bin);
for (int i = 0; i < total; i++) {
int val;
fread(&val, SZ_INT, 1, f_bin);
printf("%d ", val);
}
printf("\n");
fclose(f_bin);
return 0;
}