Загрузка данных


/*
Гусятинер Л.Б. & 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;
}