Search code examples
cpointersscanfstructurefile-handling

fscanf() cannot read without using '&' to the int data type


I am having problem with a specific part of the code which I cant find any answer to yet. Here the fscanf() was not able to read the value of file until I added an '&' sign before add.age variable in this section. I got the problem solved but still cant figure out how it works. I mean why do I need to provide address of an integer data type and not of any string. Can any one explain please?

while(fscanf(fp, "%s %d %s", add.name, &add.age, add.dept)!=EOF)
        {
            printf("%s\t\t %d\t\t %s\n", add.name, add.age, add.dept);
        }

This is the full code that I wrote for reference if you want

#include<stdio.h>
#include<stdlib.h>
void add_user(void);
void see(void);
void see_all(void);

struct student
{
    char name[50];
    char dept[50];
    int age;
}add, check;

int main()
{
    int choice;
    printf("1. Add \n2. See \n3. See All \nEnter choice:");
    scanf("%d", &choice);
    switch(choice)
    {
        case 1:add_user();
        break;
        case 2:see();
        break;
        case 3:see_all();
        break;
        default:printf("Wrong Input");
    }
}

void add_user()
{
    FILE *fp;
    printf("Enter name : ");
    fflush(stdin);
    gets(add.name);
    printf("Enter age : ");
    scanf("%d", &add.age);
    printf("Enter department : ");
    fflush(stdin);
    gets(add.dept);

    fp=fopen("Creating a file with multiple records and reading it.txt", "a+");
    if(fp==NULL)
    {
        printf("file pointer is null");
        exit(0);
    }
    fprintf(fp, "%s %d %s\n", add.name, add.age, add.dept);

    fclose(fp);
    main();
}

void see()
{
}

void see_all()
{
    FILE *fp;
    fp=fopen("Creating a file with multiple records and reading it.txt", "r");
    if(fp==NULL)
    {
        printf("file pointer is null");
        exit(0);

    }
    printf("Name\t\t Age\t\t Department\n");

    while(fscanf(fp, "%s %d %s", add.name, &add.age, add.dept)!=EOF)
    {
        printf("%s\t\t %d\t\t %s\n", add.name, add.age, add.dept);
    }
    fclose(fp);
}

Solution

  • A "string" in C (in your case a character array) already decays to a pointer indicating the address in memory of the first character. There's no such mechanism for a single int, and as a result you need to explicitly pass an address that holds an int to scanf, which is done by prefixing a variable or lvalue expression with &. scanf needs pointers so that it can write the data it scanned into memory you control and can use.