I am so incredibly frustrated right now. I have seriously been sitting here for hours trying to figure out how to validate program input using ranges from a text file. My teacher gives us a lecture that is supposed to help, but the lecture doesn't even have a thing to do with the actual assignment, and is of no help at all. I have looked all over the site and all over the internet, and I cannot find anything that tells me how to do this.

So the text file has the validation ranges printed exactly like this:

1 9999
1 5
1 50
5.00 900.00
6.00 1000.00

I need to take my previous program and remove all of the validation I currently have in it, so I can use this text file to validate the input instead. I know that it all goes in the add() function (aside from where I have to change the values in getint() and getreal()), but I have absolutely no idea how to validate the input for product number, type, quantity, cost and price using the text file. This is all I have so far:

// ** Prototypes **
void heading(void);
int menu();
int add();
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 d[], 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);

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include "Lab8.h"

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

// ** Functions **

int main()
{
	int TRUE = 1;
	int FALSE = 0;
	int select, end = TRUE;

	do
	{

		select = menu();
		switch (select)
		{
		case 1: add(); break;
		case 2:
		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);
}
/*  ================================================================  */

void heading()
{
	system("cls");
	printf("Sierra Sporting Goods\n\n\n");
	return;
}
/*  ================================================================  */

int add()
{
	double cost, price, prod_cost, prod_price, prod_profit;
	double MINCOST = 5.00;
	double MAXCOST = 900.00;
	double MINPRICE = 6.00;
	double MAXPRICE = 1000.00;
	int prodnum, prodtype, prodquan;
	int MINPROD = 1;
	int MAXPROD = 9999;
	int MINTYPE = 1;
	int MAXTYPE = 5;
	int MINQUAN = 1;
	int MAXQUAN = 50;
	char prodscrip[40];
	double types[6];
	char choice;
	FILE *fp;



	init_costs(types,6);
	fp = fopen("limits.txt", "rt");

	do
	{
		heading();

		int fscanf(FILE *fp, );
		prodnum = getint(MINPROD, MAXPROD, "product number");
		prodtype = getint(MINTYPE, MAXTYPE, "product type");
		
		printf("Enter the product description: ");
		gets(prodscrip);
		firstUpper(prodscrip);
		
		prodquan = getint(MINQUAN, MAXQUAN, "product quantity");
		cost = getreal(MINCOST, MAXCOST, "product cost");
		price = getreal(MINPRICE, MAXPRICE, "product price");
		prod_cost = total(prodquan, cost);
		prod_price = total(prodquan, price);
		prod_profit = profit(prod_price, prod_cost);

		types[prodtype] += prod_cost;

		show(prodnum, prodtype, prodscrip, prodquan, cost, price, prod_price, prod_cost, prod_profit);
		choice = prompt("Would you like to enter another product");
	}
	while (choice != 'N');
	getchar();
		show_costs(types,6);
		fclose(fp);


	
	return 0;
}
/*  ================================================================  */
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);
}
/*  ================================================================  */

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.  Press Enter to continue.\a");
		printf("%s from %d to %d: ", item, min, max);
		scanf("%d%*c", &z);
	}
	return(z);
}
/*  ================================================================  */
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;
}
/*  ================================================================  */

Simple -- you already have the ranges declared as integers or floats in lines 84-94, now all you have to do is read their values from the input file. You don't have to change another thing. Do that right after line 103 in the post above and it should work correctly.

Comments
Always extremely helpful!

Sorry I took so long to respond. I watched someone get shot in the head and killed the other night and I've been having a really hard time getting anything done...

That's awesome to know that I'm not that far away from finishing... I figured it was a lost cause. My only problem is I can't figure out how to read the values from the file. I know that you can read characters, but I'm not sure how to read each value.

Here is an example of reading integers from a file

int a,b,c,d;
FILE* fp = fopen("filename.txt","r");
if( fp != NULL)
{
    fscanf(fp, "%d", &a);
    fscanf(fp, "%d", &b);
    fscanf(fp, "%d", &c);
    fscanf(fp, "%d", &d);

   // you can also compress the above into just one line
   fscanf(fp,"%d %d %d %d", &a, &b, &c, &d);
}

Wow, that was a lot easier than I thought it would be! The only problem I'm having now is that when I do input a number that is not in the range, I get a fatal error. Here are the functions I am working with:

int add()
{
	double cost, price, prod_cost, prod_price, prod_profit;
	double MINCOST;
	double MAXCOST;
	double MINPRICE;
	double MAXPRICE;
	int prodnum, prodtype, prodquan;
	int MINPROD;
	int MAXPROD;
	int MINTYPE;
	int MAXTYPE;
	int MINQUAN;
	int MAXQUAN;
	char prodscrip[40];
	double types[6];
	char choice;
	FILE *fp;
	char line[1][6];




	init_costs(types,6);
	fp = fopen("limits.txt", "rt");

	do
	{
		heading();

		
		fscanf(fp, "%d %d %d %d %d %d %d %d %d %d", &MINPROD, &MAXPROD, &MINTYPE, &MAXTYPE, &MINQUAN, &MAXQUAN, &MINCOST, &MAXCOST, &MINPRICE, &MAXPRICE);
		prodnum = getint(MINPROD, MAXPROD, "product number");
		prodtype = getint(MINTYPE, MAXTYPE, "product type");
		
		printf("Enter the product description: ");
		gets(prodscrip);
		firstUpper(prodscrip);
		
		prodquan = getint(MINQUAN, MAXQUAN, "product quantity");
		cost = getreal(MINCOST, MAXCOST, "product cost");
		price = getreal(MINPRICE, MAXPRICE, "product price");
		prod_cost = total(prodquan, cost);
		prod_price = total(prodquan, price);
		prod_profit = profit(prod_price, prod_cost);

		types[prodtype] += prod_cost;

		show(prodnum, prodtype, prodscrip, prodquan, cost, price, prod_price, prod_cost, prod_profit);
		choice = prompt("Would you like to enter another product");
	}
	while (choice != 'N');
	getchar();
		show_costs(types,6);
		fclose(fp);


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

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

line 32: add a print statement after that to see if it read the numbers correctly. Doubles use "%f" instead of "%d" so the format string is incorrect.

Yeah I saw that and fixed them. I still get a stupid error every time I put in a number that is outside of the range though.

This article has been dead for over six months. Start a new discussion instead.