此程序应输入一个数字并计算学生标记之间的平均值。此程序仅适用于前学生,但不适用于以下学生。我觉得fscanf有一个错误。有人可以帮忙吗?
int main ()
{
FILE *cfPtr;
int matricola_in, matricola, nEsami, codEsame, voto;
char nome[20], cognome[20];
int i, j, trovato = 0;
float somma = 0.0;
printf("Inserisci una matricola:\n");
scanf("%d", &matricola_in);
if( (cfPtr = fopen("studenti.txt", "r")) == NULL )
printf("Errore");
while( !feof(cfPtr) || trovato != 1 ){
fscanf(cfPtr, "%d%s%s%d\n", &matricola, nome, cognome, &nEsami);
if( matricola_in == matricola ){
trovato = 1;
for( i = 0; i < nEsami; i++ ){
fscanf(cfPtr, "%d%d\n", &codEsame, &voto);
somma += voto;
}
printf("Media: %.1f\n", somma/nEsami);
}
}
fclose(cfPtr);
return 0;
}
编辑:数据如下:
matricola nome cognome n.esami`<eol>`
(for n.esami-rows)codice esame voto`<eol>`
...
答案 0 :(得分:1)
不清楚,但似乎该文件包含具有四个或两个项目的行的混合
考虑阅读每一行。使用sscanf将该行解析为最多四个字符串。根据需要使用sscanf
来捕获行中的整数。如果有两个项目,请在trovato
标志表示找到匹配项时处理它们。如果有四个项目,请查看是否匹配并设置trovato
。
int main ()
{
FILE *cfPtr;
int matricola_in, matricola, nEsami, codEsame, voto;
char nome[20], cognome[20];
char temp[4][20];
char line[200];
int result;
int i, j, trovato = 0;
float somma = 0.0;
printf("Inserisci una matricola:\n");
scanf("%d", &matricola_in);
if( (cfPtr = fopen("studenti.txt", "r")) == NULL ) {
printf("Errore");
return 0;
}
while( fgets ( line, sizeof line, cfPtr)){//read a line until end of file
result = sscanf ( line, "%19s%19s%19s%19s", temp[0], temp[1], temp[2], temp[3]);//scan up to four strings
if ( result == 2) {//the line has two items
if ( trovato) {// match was found
sscanf ( temp[0], "%d", &codEsame);
sscanf ( temp[1], "%d", &voto);
somma += voto;
}
}
if ( result == 4) {//the line has four items
if ( trovato) {
break;//there was a match so break
}
sscanf ( temp[0], "%d", &matricola);
sscanf ( temp[3], "%d", &nEsami);
if( matricola_in == matricola ){//see if there is a match
trovato = 1;//set the flag
}
}
}
printf("Media: %.1f\n", somma/nEsami);//print results
fclose(cfPtr);
return 0;
}