/* * Win (Thanawin Pattanaphol) * vendorInfo.c * 8th August 2024 */ #include #include #include #include #define MAX_VENDORS 20 #define MAX_FILENAME_LENGTH 4096 struct vendor_item { char vendor_name[20]; char merchandise[15]; int inventory_count; int item_price_baht; } vendors[MAX_VENDORS]; int read_input(char str[], int n); int search(char query[], struct vendor_item vendors[MAX_VENDORS], int total_vendors); int main() { char file_name[MAX_FILENAME_LENGTH]; printf("Enter name of input file: "); read_input(file_name, MAX_FILENAME_LENGTH); FILE *fp; if ((fp = fopen(file_name, "r")) == NULL) { printf("%s cannot be opened.\n", file_name); exit(EXIT_FAILURE); } // calculate file size fseek(fp, 0, SEEK_END); unsigned long file_size = ftell(fp); fseek(fp, 0, SEEK_SET); // read file to buffer char *file_buffer = (char *) malloc(file_size); int index = 0; while ((fgets(file_buffer, 50, fp) != NULL) && (index <= MAX_VENDORS)) { /* TO-DO: VALIDATE FILE DATA */ char *token = strtok(file_buffer, " "); strncpy(vendors[index].vendor_name, token, strlen(token) + 1); token = strtok(NULL, " "); /* TO-DO: VALIDATE MERCHANDISE BY PUTTING EVERYTHING AS LOWERCASE*/ strncpy(vendors[index].merchandise, token, strlen(token) + 1); token = strtok(NULL, " "); vendors[index].inventory_count = atoi(token); token = strtok(NULL, " "); vendors[index].item_price_baht = atoi(token); index++; } int total_vendors = index - 1; printf("\n>>> Read %d vendors from file %s\n", total_vendors, file_name); // print out each vendor's info for (int i = 0; i <= total_vendors; i++) { char vendor_info[200]; sprintf(vendor_info, "%s sells %s for %d each", vendors[i].vendor_name, vendors[i].merchandise, vendors[i].item_price_baht ); char vendor_stock[50]; sprintf(vendor_stock, "Inventory %d items", vendors[i].inventory_count ); printf("%-50s %s\n", vendor_info, vendor_stock); } char user_query[100]; while (1) { if ((strcmp(user_query, "DONE") == 0)) { break; } printf("What do you want to buy? (DONE to end) "); read_input(user_query, 100); // convert string to lowercase - each character one by one int user_query_length = strlen(user_query); for (int i = 0; i < user_query_length; i++) { user_query[i] = tolower(user_query[i]); }; int result = search(user_query, vendors, total_vendors); if(result > 0) { int item_amount; char input[10]; read_input(input, 10); if(atoi(input) < 0) { item_amount = atoi(input); } else { printf("You must enter a positive whole number for the number of items"); } } else { printf("No vendor in this market sells %s\n", user_query); } } fclose(fp); free(file_buffer); return 0; }; /* custom read input function str = string itself n = max amount of characters that the function is able to read into buffer reads one character at a time into buffer and adds a null terminator when finish reading */ int read_input(char str[], int n) { int ch, i = 0; while ((ch = getchar()) != '\n') { if (i < n) { str[i++] = ch; } } str[i] = '\0'; return i; }; /* Search function Parameters: - query: search query - vendors: the vendor table - total_vendors: the amount of vendors Return values: - i: Item Number - 0: No results found */ int search(char query[], struct vendor_item vendors[MAX_VENDORS], int total_vendors) { int i; for (i = 0; i < total_vendors; i++) { if (strcmp(query, vendors[i].merchandise) == 0) { printf("Query: %s | Result: %s %s\n", query, vendors[i].vendor_name, vendors[i].merchandise ); return i; break; }; }; if (i == total_vendors) { return 0; } }; /* Purchase function Parameters: - item_id: The item id that the user is purchasing - amount: How many items that the user is purchasing - vendors: vendor table Return values: - */ int purchase(int item_id, int amount, struct vendor_item vendors[MAX_VENDORS]) { if(amount <= vendors[item_id].inventory_count) { vendors[item_id].inventory_count = vendors[item_id].inventory_count - amount; return vendors[item_id].inventory_count; } else { return 0; } };