在这个程序中,我想读一个records.ssv的文件并使用结构数组打印出来。但是在打印数组之前要计算平均值。该文件包含学生姓名,身份证,考试1,考试2,项目1,项目2,平均和成绩(字母,单个)。打印一个结构数组
当前在打印出eh数组和计算平均值时出现问题。我将发布我的代码并在下面输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char name[25];
int I_D[9];
int exam[2];
int project[2];
char grade;
float avg;
} STUDENT;
void printStuAry(int size, STUDENT stuAry[]);
int main(void)
{
STUDENT stuAry[5];
FILE* f = fopen("records.ssv", "r");
if (f == NULL) {
printf("Error opening file records.ssv.\n");
exit(1);
}
char line[65];
int ind = 0;
while (fgets(line, sizeof(line), f) != NULL) {
sscanf(line, "%25[^,] ; %d ; %d ; %d ; %d ; %d ; %c",
stuAry[ind].name,
&stuAry[ind].I_D,
&stuAry[ind].exam[0],
&stuAry[ind].exam[1],
&stuAry[ind].project[0],
&stuAry[ind].project[1],
&stuAry[ind].grade);
ind++;
}
// calculates average
stuAry[ind].avg = (stuAry[ind].exam[0] + stuAry[ind].exam[1] +
stuAry[ind].project[0] + stuAry[ind].project[1]) /4.0;
printf("\t+---------+-------+-------+-------+---------+----------+----------+------+\n");
printf("\t| Index |Student| ID | Exam1 | Exam2 |Project1 | Project2 | Grade|\n");
printf("\t+---------+-------+-------+-------+---------+----------+--------+--------+\n");
printStuAry(5, stuAry);
if (fclose(f) == EOF) {
printf("Error closing file records.ssv.\n");
exit(2);
}
int letter;
printf("Enter grade letter to search and q to quit");
scanf("%d", letter);
while (letter != -1){// tests for whether user wants to end program
printStuAry(5, stuAry);
}
return 0;
}
/*
*Function name: printStuAry
*
*Input Parameters: int size Student Ary
*
*Desription: prints out student Ary
*
*Return value: 0
*/
void printStuAry(int size, STUDENT stuAry[])
{
for (int i=0; i<size; i++) {
printf("\t| %d | %s | %d | %d | %d | %d | %d | %c |\n", //displays student information
i, stuAry[i].name, stuAry[i].exam[0],
stuAry[i].exam[1], stuAry[i].project[0],
stuAry[i].project[1], stuAry[i].avg,
stuAry[i].grade);
}
}
输出
+---------+-------+-------+-------+---------+----------+----------+------+
| Index |Student| ID | Exam1 | Exam2 |Project1 | Project2 | Grade|
+---------+-------+-------+-------+---------+----------+--------+--------+
| 0 | Panzer | -544760936 | 32568 | -544762280 | 32568 | -27 | |
| 1 | Basler | -1718237240 | 32767 | -544747128 | 32568 | -104 | |
| 2 | Leaton | -1718237400 | 32767 | 118 | 0 | 9 | |
| 3 | Bishop | 4195301 | 0 | 194 | 0 | 62 | |
| 4 | Lucey | -1718237064 | 32767 | 4197349 | 0 | -96 | |
Enter grade letter to search and q to quit
正确的输出应该是什么:
原文:
+-------------------------+--------------+------+------+---------+---------+-------+-----+
| Student Name|Identification|Exam 1|Exam 2|Project 1|Project 1|Average|Grade|
+-------------------------+--------------+------+------+---------+---------+-------+-----+
| Holtkamp, Norman| N21102485| 83| 61| 62| 78| 71.00| C|
| Bellomy, Shavonda| N94185259| 74| 96| 80| 98| 87.00| B|
| Clutter, Loris| N68760306| 83| 68| 93| 70| 78.50| C|
| Rountree, Edythe| N76813896| 98| 91| 90| 81| 90.00| A|
| Waldeck, Marylee| N44293872| 88| 100| 70| 87| 86.25| B|
+-------------------------+--------------+------+------+---------+---------+-------+-----+
请妥善不知疲倦更换
sscanf(line, "%25[^,] ; %d ; %d ; %d ; %d ; %d ; %c",
nt你的代码。事实上,这让阅读变得更加困难。 – e0k这一切都不清楚?你是否声称'%c'打印了你一个数字而不是一个字符?无论哪种方式可能是结构中错误的值。注意,这也不像你在你的函数中打印ID。另外为什么是整数ID数组而不是字符串(字符数组)?更何况你只是读取它的第一个单元格的值(I_D [0]),而不是每个数字,因为你提到%d到sscanf –
另外,我建议检查你的'sscanf()'的返回值确保所有内容都被正确读取。 – e0k