Alif Khair Alif Khair - 3 months ago 5
C Question

C Program search in FILE I/O

My code is supposed to find the product ID, name, quantity and price.
When the product ID is entered, it should print the whole line where the product ID is located.

The text file contains this input:

1 CADBURY 999 1.900000
2 PEPSI 999 2.500000
3 IPHONE 976 2500.000000
4 SPIRULINA 100 50.000000


The code had been compiled with input of '4'. But the output was looping:

Please enter product ID :


It's not reading the whole line of '4'.

Here's the code:

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <ctype.h>

int addProduct();

struct product
{
int quantity, reorder, i, id;
char name[20];
float price;
};

int secondmain()
{
FILE * fp;

int i=0;
struct product a;
system("cls");

char checker;



do
{
fp = fopen("addproduct.txt","a+t");
system("cls");

printf("Enter product ID : ");
scanf(" %d", &a.id);

printf("Enter product name : ");
scanf(" %s", a.name);

printf("Enter product quantity : ");
scanf(" %d", &a.quantity);

printf("Enter product price : ");
scanf(" %f", &a.price);


fprintf(fp, "%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
printf("Record saved!\n\n");

fclose(fp);

printf("Do you want to enter new product? Y / N : ");

scanf(" %c", &checker);
checker = toupper(checker);

i++;

system("cls");
}
while(checker=='Y');



if(checker == 'N')
{
fp = fopen("addproduct.txt","r");

while(fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price)==4)
{
fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price);
printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
}

fclose(fp);

}


return(0);
}

/*-------------- ERROR START HERE-----------------*/

int main()
{
FILE * fp;
system("cls");
struct product a;
char array[255];
int productID;

fp = fopen("addproduct.txt","r");

while(1){
fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price);

productID = atoi(array);

printf("Please enter product ID : ");
scanf(" %d", &productID);

if(productID == a.id)
{
fgets(array, 255, (FILE*)fp);
printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);

}

}
return(0);
}

Answer
while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4)
{
    fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price);
    printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);
}

You are calling fscanf twice, it skips every 2nd line.

fgets(array, 255, (FILE*)fp);
printf("%d %s %d %f\n\n", a.id, a.name, a.quantity, a.price);

This part is reading the line in to text. It should then use sscanf or strtok to parse line.

You may also have to flush stdin otherwise scanf(" %c", &checker) may not work. It makes things easier to break this up in to functions. Example:

int find_item_by_id(const char* fname, int find_id)
{
    int found = 0;
    struct product a;
    FILE *fp = fopen(fname, "r");
    if (fp)
    {
        while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4)
        {
            if (a.id == find_id)
            {
                found = 1;
                break;
            }
        }
        fclose(fp);
    }

    return found;
}

void add_item(const char* fname)
{
    struct product a;
    printf("Enter product ID : ");
    scanf(" %d", &a.id);

    printf("Enter product name : ");
    scanf(" %s", a.name);

    printf("Enter product quantity : ");
    scanf(" %d", &a.quantity);

    printf("Enter product price : ");
    scanf(" %f", &a.price);

    if (find_item_by_id(fname, a.id) != 0)
    {
        printf("item already exists\n");
        return;
    }

    FILE *fp = fopen(fname, "a+");
    if (fp)
    {
        fprintf(fp, "%d %s %d %.2f\n", a.id, a.name, a.quantity, a.price);
        fclose(fp);
    }
}

int main()
{
    const char* filename = "c:\\test\\_test.txt";

    printf("list:\n");
    struct product a;
    FILE *fp = fopen(filename, "r");
    if (fp)
    {
        while (fscanf(fp, "%d %s %d %f", &a.id, a.name, &a.quantity, &a.price) == 4)
            printf("%d %s %d %f\n", a.id, a.name, a.quantity, a.price);
        fclose(fp);
    }

    while(1)
    {
        add_item(filename);

        printf("Add nother item? (y/n)\n");
        int result;
        while (1)
        {
            result = getchar();
            if (result == 'y' || result == 'n')
                break;
        }
        if (result != 'y')
            break;
    }

    return 0;
}
Comments