Как мне прочитать и распечатать информацию из двух файлов? - PullRequest
0 голосов
/ 23 марта 2020

Мой класс, мой учитель и я все не могли понять, что не так с кодом. Это система заказов в столовой, поэтому, будучи студентом, вы заказываете что-то, и это записывается в систему, и работники столовой могут соответственно готовить еду. Специфическая проблема c в том, что я пытаюсь подсчитать счет, но он печатает только первый заказанный продукт. Соответствующий код ниже и изображения прилагаются.

Меню доступных пунктов , Заказы размещены , Результат подсчета заказа // обратите внимание на заказ студента - это идентификационный номер продукта питания

struct food
{

    int   foodID;

    char  foodName[namesize];//namesize is 30

    char  foodItems[size];//specials for the day//size is 3

    int   itemTally;//total of food that needs to be prepared - REPLACED

    float totalEarnt;//total amount earnt for selling the food

    float totalSpen;//cost of food to the employer

    float totalProfits;//total profts made

    float itemCost;//cost of the food item

};

struct student
{

    char  firstname[namesize];

    char  lastname[namesize];

    int   ID;//students ID

    float form;//student's form room

    int   order;//ID of the food they ordered

    int   quantity;//how much of the food item

    float paid;//how much they paid

    int   delivery;//This is a yes or no

    char  location[aSize];//where it will be delivered to; aSize is 20

};

void orderTally()//Tallies up all the orders based on their ID; Student 1 orders 3 fish, student 2 orders 4 fish, outputs 7 fish
{

    FILE*fp;
    FILE*fp1;

    struct food foodie={0,"","",0,0.0,0.0,0.0,0.0};
    struct student orderie={"","",0,0.0,0,0,0.0,0,""};
    int i;//This is the food ID.

    if((fp1 = fopen("student", "rb+"))==NULL)//order file
    {
        printf("Cannot open order file \n");
        exit(1);
    }
    if ((fp = fopen("food", "rb+"))==NULL)//menu file
    {
        printf("Cannot open food file \n");//UPDATE: update other statements
        exit(1);
    }
    int sum=0;

    for(i=1;i<=100;i++)
    {
        fread(&orderie,sizeof(struct student),1,fp1);

        while(!feof(fp1))
        {
            if(orderie.order==i)//If the order ID is equal to one of the 100 food IDs...
            {   
                sum=sum+orderie.quantity;
            }
            fread(&orderie,sizeof(struct student),1,fp1);
        }
        if(sum!=0)
        {
            fseek(fp,(i-1)*sizeof(struct food),SEEK_SET);
            fread(&foodie,sizeof(struct food),1,fp);

            printf("------------------------------------------------------------\n");
            printf("\t\t\tORDERS\n");
            printf("------------------------------------------------------------\n\n");
            printf("%s",foodie.foodName);
            printf(" - %d\n\n",sum);
            sum=0;
        }
    }
    fclose(fp1);
    fclose(fp);
}

1 Ответ

0 голосов
/ 23 марта 2020

Это предваряется моим главным комментарием:

Вы делаете for (i=1;i<=100;i++), и первая часть этого l oop делает fread для всего содержимого fp1 [ в цикле while. Таким образом, когда i равен 2, fread получит немедленный EOF. Вам нужен fseek для fp1 [для перемотки] на каждой итерации for l oop? Если нет, то while для fp1 было бы лучше разместить над для l oop. На самом деле, перечитывать файл 100 раз бесполезно.

Я немного перестроил и упростил вещи. много проще прочитать файл студента один раз и записать все суммы в массиве.

struct food {
    int foodID;
    char foodName[namesize];            // namesize is 30
    char foodItems[size];               // specials for the day//size is 3
    int itemTally;                      // total of food that needs to be prepared - REPLACED
    float totalEarnt;                   // total amount earnt for selling the food
    float totalSpen;                    // cost of food to the employer
    float totalProfits;                 // total profts made
    float itemCost;                     // cost of the food item
};

struct student {
    char firstname[namesize];
    char lastname[namesize];
    int ID;                             // students ID
    float form;                         // student's form room
    int order;                          // ID of the food they ordered
    int quantity;                       // how much of the food item
    float paid;                         // how much they paid
    int delivery;                       // This is a yes or no
    char location[aSize];               // where it will be delivered to; aSize is 20
};

// Tallies up all the orders based on their ID; Student 1 orders 3 fish,
// student 2 orders 4 fish, outputs 7 fish
void
orderTally()
{
    FILE *fp;
    FILE *fp1;

    struct food foodie;
    struct student orderie;
    int i;                              // This is the food ID.

    // order file
    if ((fp1 = fopen("student", "rb+")) == NULL)
    {
        printf("Cannot open order file \n");
        exit(1);
    }

    int sums[101] = { 0 };

    // read _entire_ student file in one pass
    while (1) {
        if (fread(&orderie,sizeof(struct student),1,fp1) != 1)
            break;
        sums[orderie.order] += orderie.quantity;
    }

    fclose(fp1);

    // menu file
    if ((fp = fopen("food", "rb+")) == NULL)
    {
        printf("Cannot open food file \n"); // UPDATE: update other statements
        exit(1);
    }

    for (i = 1; i <= 100; i++) {
        int sum = sums[i];
        if (sum == 0)
            continue;

        fseek(fp, (i - 1) * sizeof(struct food), SEEK_SET);
        fread(&foodie, sizeof(struct food), 1, fp);

        printf("------------------------------------------------------------\n");
        printf("\t\t\tORDERS\n");
        printf("------------------------------------------------------------\n\n");
        printf("%s", foodie.foodName);
        printf(" - %d\n\n", sum);
    }

    fclose(fp);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...