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;
           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*/     
	     printf("%s, %c, %s, %s", currentCat->categoryID,
	     currentCat->drinkType, currentCat->categoryName,
	     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

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);

Recommended Answers

All 2 Replies

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.

Be a part of the DaniWeb community

We're a friendly, industry-focused community of developers, IT pros, digital marketers, and technology enthusiasts meeting, networking, learning, and sharing knowledge.