我正在做一项任务,我必须创建一个成绩报告程序。一切正常,但最后一节让我改变代码,以便从文件(student.dat)读取数据并将其用作输出数据。
student.dat示例(共有100行与此类似)。
Julius Hoffman,95,92,79,90,90
Dianne Conner,100,100,80,90,85
Mitchell Cooper,100,95,89,85,95
我的问题在于fscanf命令,因为它只读取名字
示例输出(最终程序总共有100行)
Please enter a filename: student.dat
Student Name W(30%) Q(15%) T(20%) P(15%) E(20%) TOTAL(100%) GRADE
Julius Hoffman 0 0 0 0 0 0.00 F
0 0 0 0 0 0.00 F
0 0 0 0 0 0.00 F
处理文件读取的功能如下。
int read(char filename[], char name[][MAX_NAME_SIZE], float w[], float q[], float t[],float p[],float e[]){
int i =0;
FILE *fp = NULL;
fp = fopen(filename, "r");
if (fp != NULL) {
for(i=0; i < MAX_CLASS_SIZE; i++){
fscanf(fp, "%[^,]%[^,]%[^,]%[^,]%[^,]%[^,]", name[i], w[i], q[i], t[i], p[i], e[i]);
}
fclose(fp);
} else {
printf("Failed to open file\n");
}
return 0;
}
以防万一,这是处理向用户呈现报告的功能
void display( char name[][MAX_NAME_SIZE], float w[], float q[], float t[], float p[], float e[], float total[], char grade[][MAX_LETTER_SIZE] ) {
int i = 0;
printf("Student Name W(30%) Q(15%) T(20%) P(15%) E(20%) TOTAL(100%) GRADE\n===================================================================================\n");
for(i = 0; i < MAX_CLASS_SIZE; i++){
printf("%-15s %-3.0f %-3.0f %-3.0f %-3.0f %-3.0f %-3.2f %-15s\n", name[i], w[i], q[i], t[i], p[i], e[i], total[i], grade[i]);
}
}
感谢任何建议。
答案 0 :(得分:1)
不匹配count_same_elements([1,2,3,4],[2,3,4,5])
=> 3
格式说明符。将scanf()
与"%f"
还可以节省调试时间。只需将该行读入缓冲区然后进行扫描即可。
float *
扫描空白区域,然后将扫描索引保存到" %n"
。因此,如果n
,代码知道扫描的整行。如果n > 0
,扫描没有在行尾完成。
buf[n]
答案 1 :(得分:0)
您的fscanf
应如下所示:
fscanf(fp, " %[^,],%d,%d,%d,%d,%d", name[i], &w[i], &q[i], &t[i], &p[i], &e[i]);
注意:
%[^,]
控件格式仅用于读取逗号前的字符。您没有理由为所有数据使用该控件格式(之后我想包含多个int
)。fscanf
的返回结果,确保它返回正确的值,在这种情况下,您一次只能从文本文件中读取6个值。