Home > front end >  Values lossing in fscanf
Values lossing in fscanf

Time:11-30

The IDE I used is Clion. I wanna read the Line-separated data stored in .txt file. Each line contains firstname, surname, gender, ID and age, which are str, str, str, int and int.

StudentList.txt

Olivia SWANSON F 29001 20
Emma ONEILL F 7900 19

I try to use fscanf to read the data.

FILE *fp;
char fname[20];
char sname[20];
char gender[1];
int ID;
int age;
fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r");
while(fscanf(fp, "%s %s %s %d %d", fname, sname, gender, &ID, &age)!= EOF)
{
    printf("%s,%s,%s,%d,%d\n", fname, sname, gender, ID, age);
}
fclose(fp);
return 0;

But the result it return looks like a little bit weird becasue it doesn't output the second value.

Result is

Olivia,,F,29001,20
Emma,,F,7900,19

Something shocks me is that the same code runned in PellesC lead to the correct result.

I used to learn C so there may exists some important rules in C but I didn't notice. Can anyone show that for me?

CodePudding user response:

"%s" without width

Never use "%s" in a *scanf() without a width to indicate the max number of non-white-space characters to read and save. Recall that after reading, a null character is appended. Example: if the buffer size is 100, code can only read up to 99.
char gender[1]; is too small for "F".

Wrong check

fscanf(fp, "%s %s %s %d %d", ...) can return other values than 5 or EOF. As only 5 is acceptable, test against that.

Test open success

If fopen() fails, fscanf(), fclose() are bad

Other issues exist too*

But lets use start with fixing the above.


char fname[20   1];
char sname[20   1];
char gender[1   1];
int ID;
int age;
FILE *fp = fopen("C:\\Users\\Catlover\\Desktop\\DSA\\Program2\\StudentList.txt", "r");
if (fp) {
  while(fscanf(fp, " s  s %1s %d %d", fname, sname, gender, &ID, &age) == 5) {
    printf("%s,%s,%s,%d,%d\n", fname, sname, gender, ID, age);
  }
  fclose(fp);
}
return 0;

CodePudding user response:

You need to have space to accommodate null byte also.

char gender[1];

to

char gender[2];
  • Related