Считывание массива из файла - C (СИ)

Узнай цену своей работы

Формулировка задачи:

#include <stdio.h> 
#include <malloc.h> 
#include <conio.h> 
#include <locale.h> 
#include <stdlib.h> 
#include <time.h> 

float mas(FILE*in, FILE*out);
void InsertionSort(int n, float mass[]);
float linpoisk(float mass[], int N);
 
#define BORDER_HIGH 100 
#define BORDER_LOW -100 
 
int k;
int inenull;
float* mass;
int i;
 
FILE *in;
FILE *out;
float* i_find;
char fname[20] = "output.dat";
 
int main()
{
    float mas(FILE*in, FILE*out), A;
    setlocale(LC_ALL, "RUS");
    int N;
    int a;
    
    while (2) {
        printf("Какую задачу решить? \n 1)массив неупорядочен, найти сумму эл-тов, которые следуют за минимальным эл-том\n 2)упорядочен массив, вывести номера эл-тов, меньше заданного числа\n 3)считать с файла массив и сохранить в файл номера эл-тов меньше заданного числа\n 4)1 только через считывание из файла\n 5)выход\n");
        scanf_s("%ld", &a);
        switch (a)
 
        {
 
        case 1:
            printf("Введите кол-во эл-тов массива: ");
            scanf_s("%d", &N);
            mass = (float*)malloc(N * sizeof(float));
            srand((unsigned int)(time(NULL)));
            printf("Заполните массив элементами:\n");
 
            for (i = 0; i < N; i++)
            {
                mass[i] = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX);
 
                printf("a[%d] = %.3f\n", i, mass[i]);
            }
            printf("Сумма равна : %lf \n", linpoisk(mass, N));
            free(mass); // освобождение памяти 
 
            system("pause"); break;
 
        case 2:
 
            printf("Введите кол-во эл-тов массива: ");
            scanf_s("%d", &N);
            mass = (float*)malloc(N * sizeof(float));
            srand((unsigned int)(time(NULL)));
            printf("Заполните массив элементами:\n");
 
            for (i = 0; i < N; i++)
            {
                mass[i] = BORDER_LOW + (BORDER_HIGH - BORDER_LOW)*((float)rand() / RAND_MAX);
 
                printf("a[%d] = %.3f\n", i, mass[i]);
            }
            printf("Введите число, чтобы вывести номера эл-тов меньше этого числа\n");
            scanf_s("%f", &A);
 
            InsertionSort(N, mass);
            printf("Cортируем массив:\n");
            for (int i = 0; i < N; i++)
                printf("a[%d] = %.3f\n", i, mass[i]);
            printf("\n");
 
            printf("Номера элеметов, которые меньше заданного числа:\n");
            i_find = (float*)malloc(N * sizeof(float));
            for (int i = 0; i < N; i++) {
                if (mass[i] < A) {
                    i_find[i] = (float)i;
                    printf("%.f \n", i_find[i]);
                }
                else printf(" ");
            }
 
            system("pause"); break;
        case 3:
 
            setlocale(LC_ALL, "RUS");
            puts("Чтение из файла");
            if (!(in = fopen("input.txt", "rt")))
            {
                printf("Ошибка открытия файла");
                system("pause");
            }
            puts("Запись в файла");
            if (!(out = fopen("output.dat", "wt")))
            {
                printf("Ошибка открытия файла");
                system("pause");
            }
            printf("Введите число, чтобы вывести номера эл-тов меньше этого числа\n");
            scanf_s("%f", &A);
        
            while (!feof(in))
            {
                mas(in, out);
                mass = (float*)malloc(k * sizeof(float));
                InsertionSort(k, mass);
                fprintf(out, "Cортируем массив:\n");
                for (int i = 0; i < k; i++)
                    fprintf(out, "a[%d] = %.3f\n", i, mass[i]);
                printf("\n");
                fprintf(out, "Номера элеметов, которые меньше заданного числа:\n");
                i_find = (float*)malloc(k * sizeof(float));
                for (int i = 0; i < k; i++) {
                    if (mass[i] < A) {
                        i_find[i] = (float)i;
                        fprintf(out, "%.f \n", i_find[i]);
                    }
                    else printf(" ");
                }
 
            }
            fclose(in);
            fclose(out);
            system("pause");  break;
            
        case 4: //////////////////////////////////////// 
            setlocale(LC_ALL, "RUS");
            puts("Чтение из файла");
            if (!(in = fopen("input.txt", "rt")))
            {
                printf("Ошибка открытия файла");
                system("pause");
            }
            puts("Запись в файла");
            if (!(out = fopen("output.dat", "wt")))
            {
                printf("Ошибка открытия файла");
                system("pause");
            }
        
            while (!feof(in))
            {
                mas(in, out);
                mass = (float*)malloc(k * sizeof(float));
 
            }
 
            fprintf(out, "Сумма равна : %lf \n", linpoisk(mass, N));
 
            fclose(in);
            fclose(out);
            system("pause");
                //////////////////////////////////////// 
            break;
        case 5: exit(5); break;
        default:
            break;
        }
        system("pause");
    }
}
 
float linpoisk(float mass[], int N)
{
    int i_find;
    float sum = 0;
    i_find = 0;
    for (int i = 1; i < N; i++)
    {
        if (mass[i_find] > mass[i])
            i_find = i;
    }
      printf("Номер минимального эл-та массива: %d \n", i_find);
    for (int i = i_find + 1; i < N; i++)
    {
        sum += mass[i];
    }
    return sum;
}
 
void InsertionSort(int n, float mass[])
{
    float newElement;
    int location;
 
    for (int i = 1; i < n; i++)
    {
        newElement = mass[i];
        location = i - 1;
        while (location >= 0 && mass[location] > newElement)
        {
            mass[location + 1] = mass[location];
            location = location - 1;
        }
        mass[location + 1] = newElement;
    }
}
 
float mas(FILE*in, FILE*out)
{
    fscanf(in, "%d", &k);
    fprintf(out, "Кол-во эл-тов %d \n", k);
 
    for (int i = 0; i < k; i++)
    {
        fscanf(in, "%f", &mass[i]);
        fprintf(out, "a[%d] = %6.2f\n", i, mass[i]);
    }
 
}
Нужно с файла считать массив, поработать с ним, и результат записать в др файл ( в коде кейсы 3 и 4) Так вот при работе с файлом происходят неполадки ( см. скриншот), как исправить- мозг не доходит уже 3 сутки

Решение задачи: «Считывание массива из файла»

textual
Листинг программы
mass = (float*)malloc(k * sizeof(float));

Объяснение кода листинга программы

В данном коде происходит следующее:

  1. Объявляется переменная k типа int, которая содержит размер массива.
  2. С помощью оператора malloc выделяется память под массив float типа. Выделенная память будет использоваться для хранения значений массива.
  3. В операторе присваивания переменная mass получает значение, которое является адресом выделенной памяти.
  4. Переменная mass приводится к типу float*, чтобы можно было обращаться к ней как к массиву float значений.
  5. Размер массива k умножается на размер одного элемента float, чтобы получить общую длину выделенной памяти.
  6. Результат умножения записывается в оператор sizeof, который возвращает размер памяти, занимаемой объектом типа float.
  7. Выделенная память заполняется значениями типа float.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

14   голосов , оценка 4.071 из 5
Похожие ответы