While doing some practice for an upcoming assignment I ran into a problem using fscanf and trying to throw a notice when the incorrect format is entered into the program. I'm pretty sure I have to use the return of fscanf, but can't figure out how to use it inside my while loop. Currently the program loops continuously when a value such as "a3" is entered, yet "3e" works almost fine, except it outputs the number 3 twice.
Working scanf code:
int intGet( int min, int max ) {
int input = 0;
char temp = ' ';
printf("Enter a number in between [%d-%d]: ", min, max);
if (scanf("%d%c", &input, &temp) != 2){
errorNo = 1;
return EXIT_FAILURE;
}
if (temp != '\n'){
errorNo = 2;
return EXIT_FAILURE;
}
if (input < min || input > max){
errorNo = 3;
return EXIT_FAILURE;
}
else {
printf("Read %d\n", input);
}
return EXIT_SUCCESS;
fscanf code along the same idea, which loops continuously:
int intGet( int min, int max ) {
int counterValid = 0;
int counterInvalid = 0;
int entry = 0;
int total = 0;
int input = 0;
int check = 0;
char temp = ' ';
FILE *fp;
fp = fopen("02_num.txt", "r");
if (!fp)
{
perror("fopen()");
exit(EXIT_FAILURE);
}
printf("----------------------------------------------------------\n");
printf("Entry\tInvalid\tValid\tNumber\n");
printf("----------------------------------------------------------\n");
fscanf(fp, "%*[^\n]\n"); //skips first line (min and max)
while (check != EOF){
check = fscanf(fp, "%d%c", &input, &temp);
if (check == EOF){
exit(EXIT_SUCCESS);
}
if (check != 2){
counterInvalid += 1;
entry += 1;
printf("%d\t*\t\t%d\tIncorrect Format\n", entry, input);
}
if (temp != '\n'){
counterInvalid += 1;
entry += 1;
printf("%d\t*\t\t%d\tExtra Characters\n", entry, input);
}
if (input < min || input > max){
counterInvalid += 1;
entry += 1;
printf("%d\t*\t\t%d\tInput Number out of Range\n", entry, input);
}
else{
counterValid += 1;
entry +=1;
total += input;
printf("%d\t\t*\t%d\n", entry, input);
}
}
printf("----------------------------------------------------------\n");
entry +=1;
printf("%d\t%d\t%d\t%d\n", entry, counterInvalid, counterValid, total);
return EXIT_SUCCESS;
}
This code will then output a table that looks something like this:
*****************************************************
Entry Invalid Valid Number
1 * 32
*****************************************************
// adds invalid and valid entry totals, displays then here, adds totals of valid numbers and also outputs them here.
02_num.txt file that was being used in this code, first two numbers are the min and max, read in another function.
1 15 //min and max
23
45
67
8990
3e
12
a3
Things I have tried to work with the if/while loop:
Defining a variable to record the return value of fscanf (currently the closest):
while (check != EOF){
check = fscanf(fp, "%d%c", &input, &temp);
if (check != 2){
counterInvalid += 1;
entry += 1;
printf("%d\t*\t\t%d\tIncorrect Format\n", entry, input);
}
Checking the return value in the if statement as well (scans the file twice and doesn't output properly):
while (fscanf(fp, "%d", &input) != EOF){
if (fscanf(fp, "%d%c", &input, &temp) != 2){
counterInvalid += 1;
entry += 1;
printf("%d\t*\t\t%d\tIncorrect Format\n", entry, input);
}
If there is any information I am missing please let me know, i'm just a bit stuck here.. have been for the past couple days. Probably just a stupid mistake i'm missing but thanks in advance!
Aucun commentaire:
Enregistrer un commentaire