如果不对 int 数据类型使用“&”,fscanf() 将无法读取
fscanf() cannot read without using '&' to the int data type
我对代码的特定部分有疑问,目前还找不到任何答案。这里 fscanf()
无法读取文件的值,直到我在本节中的 add.age
变量之前添加了一个“&”符号。我解决了问题,但仍然无法弄清楚它是如何工作的。我的意思是为什么我需要提供整数数据类型的地址而不是任何字符串的地址。谁能解释一下吗?
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);
}
这是我写的完整代码,大家可以参考一下
#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);
}
fscanf
(和其他 scanf
变体)接受指针,以便它们可以将读取的值分配给它们。对于字符串,您已经有一个 char *
(读作:字符指针),因此您不需要额外的 &
).
C 中的“字符串”(在您的例子中是字符数组)已经 decays 指向指示第一个字符在内存中的地址的指针。对于单个 int
没有这样的机制,因此您需要显式地将包含 int
的地址传递给 scanf
,这是通过在变量或左值表达式前加上前缀来完成的&
。 scanf
需要指针,以便它可以将扫描的数据写入您控制并可以使用的内存中。
我对代码的特定部分有疑问,目前还找不到任何答案。这里 fscanf()
无法读取文件的值,直到我在本节中的 add.age
变量之前添加了一个“&”符号。我解决了问题,但仍然无法弄清楚它是如何工作的。我的意思是为什么我需要提供整数数据类型的地址而不是任何字符串的地址。谁能解释一下吗?
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);
}
这是我写的完整代码,大家可以参考一下
#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);
}
fscanf
(和其他 scanf
变体)接受指针,以便它们可以将读取的值分配给它们。对于字符串,您已经有一个 char *
(读作:字符指针),因此您不需要额外的 &
).
C 中的“字符串”(在您的例子中是字符数组)已经 decays 指向指示第一个字符在内存中的地址的指针。对于单个 int
没有这样的机制,因此您需要显式地将包含 int
的地址传递给 scanf
,这是通过在变量或左值表达式前加上前缀来完成的&
。 scanf
需要指针,以便它可以将扫描的数据写入您控制并可以使用的内存中。