Отображение результатов - PullRequest
1 голос
/ 25 апреля 2019

Я могу ввести данные в программу и использовал некоторые операторы printf, чтобы проверить, правильно ли записываются данные. Когда мне нужно распечатать одну запись или все записи, программа либо принудительно завершает работу, либо завершает работу (dispAll), либо получает бред и не отображает найденную запись, даже если я иду в то же место на основе ключа.

Я добавил много операторов печати, чтобы увидеть, какие значения есть в записи, но у меня были смешанные результаты, определяющие, где данные теряются.

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

 struct Record
   {
      int available;
      int itemID;
      char itemName [16];
      char itemDescription [31];
      double itemUnitPrice;
      int itemOnHand;
      double value;
      int key;
   };

// function prototypes
void displayMenu ();
int getChoice ();
void processChoice (int pChoice);
void addRecord();
void modRecord ();
void dispOneRecord ();
void dispAllRecords ();
void dispItem (struct Record inventory);


int main (void)
{                                //opens the function main

// Local Declarations
   int pChoice;
   struct Record inventory;
   int i;
   FILE* fp;
   int ava = 0;

// Statements

   // creates a file to be used by the program
   fp = fopen ("invent.txt", "wb+");

   for (i = 0; i < 23; i++)
   {
       fseek(fp, i * sizeof(struct Record), SEEK_SET);

       fwrite(&ava, sizeof(int), 1, fp);
   }

   fclose (fp);

    do 
      {                          // begins do loop

         displayMenu();

         pChoice = getChoice();

         processChoice (pChoice); 

      } 
   while (pChoice != 5);       // ends do loop

return(0);

} // closes main

void displayMenu ()
{

   printf("\n ***********************************************************\n"); 
   printf("\n               Inventory Management System                  \n");
   printf("\n Select the number for the action you would like to conduct.\n");     

   printf("\n 1 - Add Inventory Records to File");
   printf("\n 2 - Modify Data in an Inventory Record");
   printf("\n 3 - Display One Item and Value");
   printf("\n 4 - Report all Inventory and the Total Value");
   printf("\n 5 - Exit the Program\n\n");

   printf("\n ***********************************************************\n"); 

 return;
}

int getChoice ()
{

   // local variables
   int pChoice;

   // prompts the user for their choice

   printf("\nPlease enter your choice: ");

   scanf("%d", &pChoice);

   return(pChoice);
}

void processChoice (int pChoice)
{

   switch (pChoice)
   {

      case 1:
           addRecord();
           break;

      case 2:
           modRecord();
           break;

      case 3:
           dispOneRecord();
           break;

      case 4: 
           dispAllRecords();
           break;
   }
return;
}

void addRecord()
{

   //Local Variables
   FILE* fp;
   struct Record inventory;

   printf("\nPlease enter the Item Identification Number: ");
   scanf("%d", &inventory.itemID);

   printf("\nPlease enter the Item Name (Limit of 15 Characters): ");
   scanf("%s", inventory.itemName);

   printf("\nPlease enter the Item Description (Limit of 30 Characters): ");
   scanf("%s", inventory.itemDescription);

   printf("\nPlease enter the Item Unit Price: $");
   scanf("%lf", &inventory.itemUnitPrice);

   printf("\nPlease enter the number of Items on Hand: ");
   scanf ("%d", &inventory.itemOnHand);

   inventory.value = inventory.itemUnitPrice * inventory.itemOnHand;  

   fp = fopen("invent.txt", "rb+");

   inventory.key = inventory.itemID % 23;  

printf ("\n%d", inventory.key);

   fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);

   fread (&inventory.available, sizeof(int), 1, fp);

printf ("\n%d", inventory.available);

   if (inventory.available == 0)

   {

      fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);

      inventory.available = 1;

      fwrite(&inventory, sizeof(struct Record), sizeof(struct Record), fp);

printf ("\nI wrote the record. %d   key=%d, name=%s", inventory.available, inventory.key, inventory.itemName);

      fclose (fp);

   }
   else
      while (inventory.available == 1)
      {

         inventory.key = inventory.key + 1;

         fread (&inventory.available, sizeof(int), 1, fp);

         if (inventory.available == 0)

         {

            fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);

            inventory.available = 1;

            fwrite (&inventory, sizeof(struct Record), sizeof(struct Record), fp);

printf ("\nResolved collision and wrote the file.");

            fclose (fp);         

         } // end if

      } // end while

return;
} 

void modRecord ()
{
   //local variables
   FILE* fp;
   struct Record inventory;

   printf ("\nPlease enter the Item ID: ");
   scanf ("%d", &inventory.itemID);

   fp = fopen("invent.txt", "rb+");

   inventory.key = inventory.itemID % 23;  

   fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);

   fread (&inventory.available, sizeof(int), 1, fp);

   if (inventory.available == 0)

      printf ("\nNo Record Found.");

   else if (inventory.available == 1)
   {

      fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);

      printf("\nPlease enter the Item Name (Limit of 15 Characters): ");
      scanf("%s", inventory.itemName);

      printf("\nPlease enter the Item Description (Limit of 30 Characters): ");
      scanf("%s", inventory.itemDescription);

      printf("\nPlease enter the Item Unit Price: $");
      scanf("%lf", &inventory.itemUnitPrice);

      printf("\nPlease enter the number of Items on Hand: ");
      scanf ("%d", &inventory.itemOnHand);

      inventory.value = inventory.itemUnitPrice * inventory.itemOnHand;  

      fp = fopen("invent.txt", "rb+");

      fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);

      fread (&inventory.available, sizeof(int), 1, fp);

      fwrite(&inventory, sizeof(struct Record), sizeof(struct Record), fp);

      fclose (fp);

   } // end if

return;

}

void dispOneRecord ()
{
   // local variables
   FILE* fp;
   struct Record inventory;   

   printf ("\nPlease enter the Item ID: ");
   scanf ("%d", &inventory.itemID);

   fp = fopen("invent.txt", "rb+");

   inventory.key = inventory.itemID % 23;  

printf ("\n%d", inventory.key);

   fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);

   fread (&inventory, sizeof(int), 1, fp);

printf ("\n%d, %s", inventory.available, inventory.itemName);

   if (inventory.available == 0)

      printf ("\nNo Record Found.");

   else if (inventory.available == 1)
   { 
      fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);
      fread (&inventory, sizeof(struct Record), sizeof(struct Record), fp);

printf ("\nI have found the record.");
      printf ("\nItem ID:                %-d\n", inventory.itemID);
      printf ("\nItem Name:              %-s\n", inventory.itemName);
      printf ("\nItem Description:       %-s\n", inventory.itemDescription);
      printf ("\nItem Unit Price:        $%-0.2lf\n", inventory.itemUnitPrice);
      printf ("\nNumber of Item on Hand: %-d\n\n\n", inventory.itemOnHand);
      printf ("\nTotal Value of Items on Hand: $%-0.2lf\n", inventory.value = inventory.itemUnitPrice * inventory.itemOnHand);
   } // end if
return;
}

void dispAllRecords ()
{

   // local variables
   FILE* fp;
   struct Record inventory;
   double tValue = 0;

   printf("\n ***********************************************************\n");    
   printf("\n                  Inventory Management System               \n");
   printf("\n ***********************************************************\n"); 

   inventory.key = 0;

   while (inventory.key < 23)
   {

      fseek (fp, inventory.key * sizeof(struct Record), SEEK_SET);

      fread (&inventory, sizeof(int), 1, fp);

      if (inventory.available == 0)
         inventory.key = inventory.key + 1;

      else 
      {

         fseek(fp, inventory.key * sizeof(struct Record), SEEK_SET);

         fread (&inventory, sizeof(struct Record), sizeof(struct Record), fp);

         printf ("\nItem ID:                %-d\n", inventory.itemID);
         printf ("\nItem Name:              %-s\n", inventory.itemName);
         printf ("\nItem Description:       %-s\n", inventory.itemDescription);
         printf ("\nItem Unit Price:        $%-0.2lf\n", inventory.itemUnitPrice);
         printf ("\nNumber of Item on Hand: %-d\n\n\n", inventory.itemOnHand);
         printf ("\nTotal Value of Items on Hand: $%-0.2lf\n", inventory.value = inventory.itemUnitPrice * inventory.itemOnHand);

         tValue = tValue + inventory.value;

         inventory.key = inventory.key + 1;
      } // end if
   } // end while

   printf ("\nThe total value of the inventory is: $%lf", tValue);

return;
} 

Разрешить пользователю вводить данные в файл произвольного доступа Изменить эту запись искать и отображать одну запись искать и отображать все записи и отображать общую стоимость инвентаря

...