DaniWeb IT Discussion Community

DaniWeb IT Discussion Community (http://www.daniweb.com/forums/index.php)
-   C (http://www.daniweb.com/forums/forum118.html)
-   -   struct linked list problem (http://www.daniweb.com/forums/thread44585.html)

musicmancanora4 May 2nd, 2006 7:47 am
struct linked list problem
 
Hey guys im reading in a text file with several fields iv tokenized
the '|' so that it only reads the fields categoryId, drinkType, the categoryName, and categoryDescription.

My question is how come when i read the file and copy the reading buffer
"temp" into each struct it does not print out each line in the text file it prints nothing. I traverse through the list and try to print it out?

C0001|H|Espresso Classics|The traditional espresso favourites




int loadData(GJCType* menu, char* menuFile, char* submenuFile)
{
  /*pointer for malloc*/
  CategoryType *newCat, *currentCat, *prevCat;
 
 

  /*declaration of variables*/
  int CountNoLines = 0;
  char temp[LINE_LENGTH];
 
  /* variables for tokenizer for menu file*/
  char *catID;
  char *catType;
  char *catName;
  char *catDescription;
  char *delim;
 
  /* declare file pointers to files*/
  FILE *f1;
  FILE *f2;
 
 
  /* opening the menu and submenu for reading*/
  f1 = fopen(menuFile, "r");
  f2 = fopen(submenuFile, "r");
 
  /* check to see if the filuse exists*/
  if(f1 ==NULL || f2 == NULL)
  {
      /* check whether both files have existed or typed in correctly*/
      if(f1 == NULL && f2 == NULL)
      {
     
        printf("Both files do not exist %s %s\n",menuFile,submenuFile);
      }
      /* check for each file existance*/
      else if (f1 == NULL)
      {
        printf("%s does not exist\n\n",menuFile);
      }
      /* check for each file existance*/
      else if(f2 == NULL)
      {
        printf("%s does not exist\n\n", submenuFile);
       
      }
      printf("EXITING PROGRAM ERROR!\n\n");
      return ERRORCODE; /* cannot proceed*/
  }
 
  /* counts how many fields there are in the file*/
  while(fgets(temp, LINE_LENGTH, f1)!=NULL)
  {
     
             
      newCat = malloc(sizeof(CategoryType));
     
      if(prevCat == NULL)
      {
          menu->headCategory = newCat;
      }
      else
      {
     
         
       
          prevCat->nextCategory = newCat;
     
   
 
          /* stores the catID but also checks if there
          is a duplicate*/
           
          catID = strtok(temp, "|");
         
          /* checking whether it tokenizez*/
          if(catID == NULL)
          {
              printf("CatID missing\n");
          }
         
          /*checks for a duplication of the id field*/
          if(!checkDuplicationID(menu, catID))
          {
              return ERRORCODE;
          }
          /* gets the second field and tokenizez it*/
          catType = strtok(NULL, "|");
         
            /* checking whether it tokenizez*/
          if(catType == NULL)
          {
              printf("CatType missing\n");
          }
         
          catName = strtok(NULL, "|");
         
            /* checking whether it tokenizez*/
          if(catName == NULL)
          {
              printf("CatName missing\n");
          }
          catDescription = strtok(NULL, "\0");
         
            /* checking whether it tokenizez*/
          if(catDescription == NULL)
          {
              printf("CatDescription missing\n");
          }
         
          /* checks the string length of the field*/
          if((strlen(catID) >ID_LEN) ||
              (strlen(catType) >MAX_NAME_LEN)  ||
              (strlen(catDescription) >MAX_DESC_LEN))
             
          {         
         
              printf("Wrong data format\n\n");
              return ERRORCODE;
             
          }
         
          strcpy(newCat->categoryID, temp);
          newCat->drinkType = temp[0];
          strcpy(newCat->categoryName, temp);
          strcpy(newCat->categoryDescription, temp);
         
         
         
          newCat -> nextCategory = NULL;
          newCat->headItem = NULL;
          newCat->numItems = 0;
          prevCat = newCat;
         
          currentCat = menu->headCategory;
         
        }/* end of if else used to tokenize and copy variables
          from and into structs*/   
          while(currentCat!=NULL)
          {
            printf("%s, %c, %s, %s", currentCat->categoryID,
            currentCat->drinkType, currentCat->categoryName,
            currentCat->categoryDescription);
           
            currentCat = currentCat->nextCategory;
          }
       
         
       
         
  } /* end of while loop*/ 
     
 
 
  /* close both files after reading*/
  if(fclose(f1)!=0 || fclose(f2)!=0)
  {
      fprintf(stderr, "Error in closing files\n");
  } 
 

  return EXIT_SUCCESS;
}

#ifndef GJC_H
#define GJC_H

/* System-wide header files. */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* System-wide constants. */
#define ID_LEN 5
#define MIN_NAME_LEN 1
#define MAX_NAME_LEN 25
#define MIN_DESC_LEN 1
#define MAX_DESC_LEN 250
#define NUM_PRICES 3
#define HOT 'H'
#define COLD 'C'
#define ERRORCODE 1
#define VALID 0
#define LINE_LENGTH 500
#define TOKEN_PRODUCT 4

typedef struct category* CategoryTypePtr;
typedef struct item* ItemTypePtr;

/* Structure definitions. */
typedef struct price
{
  unsigned dollars;
  unsigned cents;
} PriceType;

typedef struct item
{
  char itemID[ID_LEN + 1];
  char itemName[MAX_NAME_LEN + 1];
  PriceType prices[NUM_PRICES];
  char itemDescription[MAX_DESC_LEN];
  ItemTypePtr nextItem;
} ItemType;

typedef struct category
{
  char categoryID[ID_LEN + 1];
  char categoryName[MAX_NAME_LEN + 1];
  char drinkType;      /* (H)ot or (C)old. */
  char categoryDescription[MAX_DESC_LEN];
  CategoryTypePtr nextCategory;
  ItemTypePtr headItem;
  unsigned numItems;
} CategoryType;

typedef struct gjc
{
  CategoryTypePtr headCategory;
  unsigned numCategories;
} GJCType;

int commandLineArguments(int argc, char* argv[]);
int countToken(FILE *fp, char* temp, int tokenPerLine);
#endif

dude543 May 2nd, 2006 10:21 am
Re: struct linked list problem
 
Your coping the same value (temp) for all the fileds :

   strcpy(newCat->categoryID, temp);
  newCat->drinkType = temp[0];
  strcpy(newCat->categoryName, temp);
  strcpy(newCat->categoryDescription, temp);

You should use the pointers you saved like for example :

strcpy(newCat->categoryDescription, catDescription);



Another thing :
Automatic variables inside a fucntion are initailzed to garabge.
CategoryType *newCat, *currentCat, *prevCat;
You forgot to initalize prevCat before you test it
against a NULL.

musicmancanora4 May 3rd, 2006 10:54 am
Re: struct linked list problem
 
thanks got it...


All times are GMT -4. The time now is 1:24 am.

Forum system based on vBulletin Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
©2003 - 2009 DaniWeb® LLC