对于功课assignement,我需要填写学生结构,看起来像下面的列表:这将是填充该结构的最佳方式?
struct Student {
int matriculationNumber;
char *firstName;
char *lastName;
char *birthday;
double averageGrage;
}
的实际数据必须从一个.csv
文件中读取,看起来somethink像
2345678;梅耶尔;汉斯; 1985年12月10日; 2,4-
1234567;穆勒;弗里茨; 1990年5月17日; 1,9-
为了读取数据,应该使用fgetc()
。现在
,问题是我怎么实际上填补了结构的领域,以及如何处理异常情况(即意外EOF
;想起例如,如果一个行不包含字段birthday
或场averageGroup
)。
这是我会做它直观地(这是最有可能的方式不对;-)):
Student student;
if (fillMatriculationNumber(&student, fp) == -1) { // return -1 on failure or EOF
goto failure;
}
if (fillFirstName(&student, fp) == -1) {
goto failure;
}
if (fillLastName(&student, fp) == -1) {
goto failure;
}
if (fillBirthday(&student, fp) == -1) {
goto failure;
}
if (fillAverageGrade(&student, fp) == -1) {
goto failure;
}
// OK
:failure
// print a message about what's wrong, and exit()
我是C新手,但我认为`goto`语句多年没有使用过? – MrMisterMan 2010-11-23 14:15:04
Imo,转发goto就像这些,如果使用负责任,实际上可以提高代码的可读性 - 太多的返回语句和/或高度嵌套和缩进代码是其他选择。 @MrM – Amarghosh 2010-11-23 14:24:19
几乎可以肯定的是,你不应该使用goto来在代码中向后跳转。使用goto跳出循环或进行基本的异常处理是可以的,但应尽可能避免。 – onemasse 2010-11-23 15:46:55