我对 C 的结构有疑问。我想编写一个程序,从 grades.txt
读取数据,将其保存到结构化数组并打印它。所以我在下面写了一段代码。
program.c
#include <stdio.h>
#include <string.h>
int main()
{
FILE *fp1;
fp1 = fopen("grades.txt","r");
int i = 0,j;
typedef struct
{
int number;
int q[4];
int total;
} student;
student a[101];
while(feof(fp1) == 0)
{
if(i==0) i++;
else
{
fscanf(fp1,"%d %d %d %d %d %d", &a[i].number, &a[i].q[0], &a[i].q[1], &a[i].q[2], &a[i].q[3], &a[i].total);
printf("%d %d %d %d %d %d\n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);
i++;
}
}
fclose(fp1);
return 0;
}
但是,它会打印垃圾值和段错误错误。
778121006 7632239 778121006 7632239 0 -1399308296
Segmentation fault
grades.txt的内容是
成绩.txt
ID Q1 Q2 Q3 Q4 Total
20131122 20 14 18 22 74
20132400 16 23 11 19 69
最佳答案
首先,您没有检查 fopen()
的返回值,就好像文件不存在一样,您的代码不应该对 fp1
执行进一步操作。因此检查返回值为
fp1 = fopen("grades.txt","r");
if(fp1 == NULL) {
/* error handling */
}
其次,正如 @paul Why is “while ( !feof (file) )” always wrong? 所提到的,而是在 while
循环中使用 fscanf()
并检查 fscanf()
的返回值为
while(fscanf(fp1,"%d %d %d %d %d %d", &a[i].number, &a[i].q[0], &a[i].q[1], &a[i].q[2], &a[i].q[3], &a[i].total) == 6 ) { /* 6 is the no of read item */
printf("%d %d %d %d %d \n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);
i++;
}
您犯了一些愚蠢的错误,因为 printf()
语句中有一个额外的 %d
,您可以在使用 -Wall 编译时解决或观察到这些错误
标志。
这个
printf("%d %d %d %d %d %d\n", a[i].number,a[i].q[0], a[i].q[1], a[i].q[2], a[i].total);
有 6 个 %d
,但您只提供了 5 个参数,请删除多余的 %d
,因为只有 5 个参数。
关于c - 将值输入到结构化数组中的数组时出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50625772/