Си.Разделить маленькую программку на две функции

Мне нужно переписать данную программу на две функции, а точнее, разделить, чтобы всё не валялось в мэйне. А вот, собственно , и нужные мне функции:

1.Считывание данных из текстового файла в массив

2.Поиск нужной информации в полученном массиве.

Но только вот, я не знаю, как прописывать ф-ции при работе со структурами.Компилятор выдает кучу ошибок.

(Еще раз повторюсь.Мне бы только переписать программу с использованием этих 2-х функий.Сама программа работает корректно.Остался лишь вопрос оформления. И будьте добры, не кидайтесь тапками, я в этом новичок и буду благодарна за помощь :))

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

int main(int argc, char *argv[]) {
    
    int j , i;
        FILE *f;
        char name [25];
        printf ("enter the name of the file: ");
        scanf ("%s", name);
        if((f = fopen(name, "r")) == NULL)
        {
            printf ("file not found");
            system ("PAUSE");

        }

        typedef struct{
            char Name[30];
            char Price[30];
            char Shelf_life[30];
        
        }stuff;
        int n=0,k;
        stuff a;
        stuff *x=NULL;
        while (!feof(f)){
            if(fscanf (f,"%s", a.Name)!=1)
                       break;
            fscanf (f,"%s",a.Price);
            fscanf (f,"%s",a.Shelf_life);
            x=(stuff*)realloc(x,sizeof(stuff)*(n+1));
            x[n]=a;
            n++;             
        }
        
        fclose(f);
        for (i=0;i<n;i++){
            printf("%s %s %s\n", x[i].Name,x[i].Price,x[i].Shelf_life);}  
        
         char Name[30];
         printf("enter the product name :  \n");
         scanf (" %s", Name);
        int t,s,min=0;
        for (i=0;i<n;i++){
            if (strcmp(x[i].Name, Name) == 0){
                t=i;
            break;  
            }
            
        }
        min=t;
        //printf("%d \n", t);
        for (s=t+1;s<n;s++ ){
            if (strcmp(x[s].Name, Name) == 0){
                if (strcmp(x[s].Price, x[min].Price) < 0){
                    min=s;
                }
                
            }   
        }
        printf("minimum price : %s \n", x[min].Price);
        system("PAUSE"); 
        free(x); 
    
    return 0;
}

Ответы (1 шт):

Автор решения: Павел Ериков

Ну наверно как-то так:

#include <stdio.h>
#include <stdlib.h>
#include <string.h> 

typedef struct {
    char Name[30];
    char Price[30];
    char Shelf_life[30];
} stuff;

//Принимает открытый файл и указатель на int 
//куда будет записан размер структуры 
stuff* getData(FILE* f, int* n) {
    *n = 0;
    stuff a;
    stuff* arr = NULL;
    while (!feof(f)) {
        if (fscanf(f, "%s", a.Name) != 1)
            break;
        fscanf(f, "%s", a.Price);
        fscanf(f, "%s", a.Shelf_life);
        arr = (stuff*)realloc(arr, sizeof(stuff) * (*n + 1));
        arr[*n] = a;
        (*n)++;
    }
    return arr;
}
//Принимает введенное имя, массив и его размер
//возвращает -1 если имя не найдено, иначе индекс минимальной цены
int getMinByName(char* Name, stuff* x, int n) {
    int t = -1;
    for (int i = 0; i < n; i++) {
        if (strcmp(x[i].Name, Name) == 0) {
            t = i;
            break;
        }
    }
    if (t == -1) return -1;

    int min = t;
    for (int s = t + 1; s < n; s++) {
        if (strcmp(x[s].Name, Name) == 0) {
            if (strcmp(x[s].Price, x[min].Price) < 0) {
                min = s;
            }
        }
    }
    return min;
}

int main(int argc, char* argv[]) {
    //Открываем файл
    FILE* f;
    char name[25];
    printf("enter the name of the file: ");
    scanf("%s", name);
    if ((f = fopen(name, "r")) == NULL)
    {
        printf("file not found");
        system("PAUSE");
    }

    //Получаем данные
    int n = 0;
    stuff* x = getData(f, &n);
    //Закрываем файл
    fclose(f);
   
    
    for (i = 0; i < n; i++) {
        printf("%s %s %s\n", x[i].Name, x[i].Price, x[i].Shelf_life);
    }

    char Name[30];
    printf("enter the product name :  \n");
    scanf(" %s", Name);
    
    //Ищем минимальную стоимость продукта
    int min = getMinByName(Name, x, n);
    if (min < 0) printf("Name is not found!\n");
    else printf("minimum price : %s \n", x[min].Price);

    system("PAUSE");
    free(x);

    return 0;
}
→ Ссылка