-1

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);
}
  • Mohsin Khan, Code is `while(fscanf(fp, "%s %d %s", add.name, &add.age, add.dept)!=EOF)`. What should happen if `fscanf()` returned 1? Consider `while(fscanf(fp, "%s %d %s", add.name, &add.age, add.dept) == 3)` instead. – chux - Reinstate Monica Sep 26 '20 at 23:46

2 Answers2

1

fscanf (and other scanf variants) take pointers so they can assign the read values to them. In the case of strings, you already have a char * (read: char pointer), so you don't need and additional &).

Mureinik
  • 252,575
  • 45
  • 248
  • 283
1

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.

nanofarad
  • 36,174
  • 4
  • 79
  • 104