Hi guys, I have been working on this for 13 hours straight now, and I am going out of my mind. I have a final due tonight and I cannot figure this out at all. The program is basically a product database for a sporting goods store, and I have to store all of the data in a struct record, then put in it a binary file and display all of the records as a report when the report() function is selected from the menu. Problem is my report() function is completely messed up and it displays a weird jumbled report a bunch of times and then exits out to the menu. I have to figure this out, please help me!

// ** Prototypes **

void heading(void);
int menu();
int add();
void report();
void getstring(char entry[], char prompt[]);
int getint(int min, int max, char prompt[]);
double getreal(double min, double max, char prompt[]);
double total(double quantity, double amount);
double profit(double profit_cost, double profit_price);
void init_costs(double t[], int x);
void show_costs(double t[], int x);
void show(int prodnum, int prodtype, char prodscrip[], int prodquan, double cost, double price, double prod_price, double prod_cost, double prod_profit);
int menuerror(int min, int max, char prompt[]);
int prompt(char msg[]);
int quit(void);
void message(char msg[]);
void firstUpper(char *buf);
void line(char c, int t);

struct sports
{
    int prodnum;
    int prodtype;
    char prodscrip[20];
	int prodquan;
    double cost;
    double price;
};

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "10 final.h"

/* ================================================================== */

// ** Functions **

#define clrscr() system("cls")

int main()

	{
	int TRUE = 1;
	int FALSE = 0;
	int select, end = TRUE;


	do
		{

		select = menu();
		switch (select)
			{
			case 1: add(); break;
			case 2: report(); break;
			case 3:
			case 4:
			case 5: end = quit(); break;
			default: message("\n\nPlease make a selection between 1 and 5.\a");
			}
		}

		while (end);
		return 0;
	}
/* ================================================================ */

int menu()
	{
	int choice;

	system("cls");

	printf("Sierra Sporting Goods\n\n");
	printf("1 = Add a record\n");
	printf("2 = Report\n");
	printf("3 = Delete a record\n");
	printf("4 = Change a record\n");
	printf("5 = Quit\n\n");
	choice = menuerror(1, 5, "Enter your selection");

	return(choice);
	}
/* ================================================================ */

int add()
	{
	double prod_cost, prod_price, prod_profit;
	double MINCOST;
	double MAXCOST;
	double MINPRICE;
	double MAXPRICE;

	int MINPROD;
	int MAXPROD;
	int MINTYPE;
	int MAXTYPE;
	int MINQUAN;
	int MAXQUAN;
	int i;
	double types[6];
	char choice;
	FILE *fp;
	FILE *f;

	init_costs(types,6);
	struct sports s;


	f = fopen("limits.txt", "rt");

	if (f == NULL)
		{
		printf("File does not exist");
		return 0;
		}

	else
		{
		fscanf(f, "%d %d %d %d %d %d %lf %lf %lf %lf", &MINPROD, &MAXPROD, &MINTYPE, &MAXTYPE, &MINQUAN, &MAXQUAN, &MINCOST, &MAXCOST, &MINPRICE, &MAXPRICE);
		}
	fclose(f);


	fp = fopen("data.dat", "ab+");
	if (fp == NULL)
		{
		message("Error opening data file\a");
		return 1;
		}
	fseek(fp, 0L, SEEK_END);
	i = (int)ftell(fp) / sizeof(struct sports);

	do
		{
		heading();

		s.prodnum = getint(MINPROD, MAXPROD, "product number");
		s.prodtype = getint(MINTYPE, MAXTYPE, "product type");

		printf("Enter the product description:");
		gets(s.prodscrip);

		s.prodquan = getint(MINQUAN, MAXQUAN, "product quantity");
		s.cost = getreal(MINCOST, MAXCOST, "product cost");
		s.price = getreal(MINPRICE, MAXPRICE, "product price");
		prod_cost = total(s.prodquan, s.cost);
		prod_price = total(s.prodquan, s.price);
		prod_profit = profit(prod_price, prod_cost);

		types[s.prodtype] += prod_cost;

		fwrite(&s, sizeof(struct sports), 1, fp);

		show(s.prodnum, s.prodtype, s.prodscrip, s.prodquan, s.cost, s.price, prod_price, prod_cost, prod_profit);

		choice = prompt("Would you like to enter another product");
		getchar();
		}
		
		while (choice != 'N');
		show_costs(types,6);
		return 0;

		fclose(fp);
	}
/* ================================================================ */

void report()

	{
	double prod_profit = 0, total_profit = 0;

	FILE *fp;
	struct sports s;
	int c;



	printf("Sierra Sporting Goods\n");
	fp = fopen("data.dat","ab+");
	if (fp == NULL)
		{
		printf("File does not exist");
		return;
		}
	printf("Product Inventory\n\n");
	c = printf("%-4s%6s%20s%18s%10s%10s%11s\n", "#", "Type", "Description", "Quantity", "Cost", "Price", "Profit");
	line('=', c-1);
	while (fread(&s, sizeof(s), 1, fp) != 0)
		{

		prod_profit = (s.price - s.cost) * s.prodquan;


		printf("%-4d%5d%15s%8d%13.2lf%10.2lf%11.2lf\n", s.prodnum, s.prodtype, s.prodscrip, s.prodquan, s.cost, s.price, prod_profit);
		line('=', c-1);
		total_profit += prod_profit;
		printf("Total Expected Profit%58.2f\n\n", total_profit);

		}
	fclose(fp);

return;
	}
/* ================================================================ */

void heading()
	{
	system("cls");
	printf("Sierra Sporting Goods\n\n\n");
	return;
	}
/* ================================================================ */
void show(int prodnum, int prodtype, char prodscrip[], int prodquan, double cost, double price, double prod_price, double prod_cost, double prod_profit)
	{

	printf("\n\n\nThe product number is ----------> %04d\n", prodnum);
	printf("The product type is ------------> %d\n", prodtype);
	printf("The product description is -----> %s\n", prodscrip);
	printf("The quantity is ----------------> %d\n", prodquan);
	printf("The cost is --------------------> $%.2lf\n", cost);
	printf("The price is -------------------> $%.2lf\n\n", price);

	printf("Total product price ----------> $%.2lf\n", prod_price);
	printf("Total product cost -----------> $%.2lf\n", prod_cost);
	printf("Total product profit ---------> $%.2lf\n\n\n\n", prod_profit);

	return;
	}
/* ================================================================ */

void getstring(char *entry, char * prompt)
	{
	printf("Enter the %s: ", prompt);
	gets(entry);
	firstUpper(entry);
	}
/* ================================================================ */
void firstUpper(char *buf)
	{
	while (*buf)// Continue as long as characters available.
		{
		while( isspace(*buf) || !isalpha(*buf) )
			*buf++; // Skip all spaces until next character.
		*buf = toupper(*buf); // Capitalize first character after space.
		while(*buf && !isspace(*buf) )
			*buf++; // Skip all characters until next space.
		}
	}
/* ================================================================ */

int getint(int min, int max, char item[])
	{
	int x;
	printf("Enter the %s between %d and %d: ", item, min, max);
	scanf("%d%*c", &x);
	while (x < min || x > max)
		{
		message("\nError in range. Press Enter to continue.\a");
		printf("Enter the %s between %d and %d: ", item, min, max);
		scanf("%d%*c", &x);
		}
	return(x);
	}
/* ================================================================ */

double getreal(double min, double max, char item[])
	{
	double y;

	printf("Enter the %s between $%.2lf and $%.2lf: ", item, min, max);
	scanf("%lf%*c", &y);
	while (y < min || y > max)
		{
		message("\nError in range. Press Enter to continue.\a");
		printf("Enter the %s between $%.2lf and $%.2lf: ", item, min, max);
		scanf("%lf%*c", &y);
		}
	return(y);
	}
/* ================================================================ */

double total(double quantity, double amount)
	{
	return (quantity * amount);
	}
/* ================================================================ */

double profit(double profit_price, double profit_cost)
	{
	return (profit_price - profit_cost);
	}
/* ================================================================ */

void init_costs(double *t, int x)
	{
	int z;

	for (z = 1; z < x; z++)
		*(t + z) = 0;

	}
/* ================================================================ */

void show_costs(double *t, int x)
	{
	int z;
	double total = 0;

	system("cls");

	printf(" Product Cost by Type\n\n");
	printf("_Type_____________Cost_\n\n");
	for (z = 1; z < x; z++)
		{
		printf(" %2d%20.2lf\n", z, *(t+z));
		total += *(t+z);
		}
	printf("________________________\n");
	printf("%23.2lf\n\n\n\n", total);
	printf("Press ENTER to return to the Main Menu...");
	getchar();


	}
/* ================================================================ */
void message(char *msg)
	{
	printf("%s\n\n", msg);
	}
/* ================================================================ */
void line(char c, int t)
	{
	while (t--) putchar(c);
	putchar('\n');
	}
/* ================================================================ */
int prompt(char *msg)
	{
	int z;
	do
		{
		printf("%s (Y/N)? ", msg);
		z = toupper(getchar());
		if (z != 'Y' && z != 'N') printf("\nError, please enter Y or N only.\n");
		}
		while (z != 'Y' && z != 'N');
		return(z);
	}
/* ================================================================ */
int quit()
	{
	int TRUE = 1;
	int FALSE = 0;
	int z, end = TRUE;

	z = prompt("\nEnd program\a");
	if (z == 'Y')
		{
		system("cls");
		message("\nSierra Sporting Goods Database closed successfully.");
		end = FALSE;
		}
	return(end);
	}
/* ================================================================ */
int menuerror(int min, int max, char item[])
	{
	int z;
	printf("%s from %d to %d: ", item, min, max);
	scanf("%d%*c", &z);
	while (z < min || z > max)
		{
		message("\nError in range.\a");
		printf("%s from %d to %d: ", item, min, max);
		scanf("%d%*c", &z);
		}
	return(z);
	}
/* ================================================================ */

Note: The limits file looks like this:

1 9999
1 5
1 50
5.00 900.00
6.00 1000.00

oops! sorry, wrong thread

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.