简体   繁体   English

我不确定如何正确使用 fscanf

[英]I am unsure how to use fscanf properly

This program should get in input a number and calculate the average value between a student's marks.该程序应该输入一个数字并计算学生分数之间的平均值。 This program works only with the former student, but not with the following ones.该程序仅适用于以前的学生,但不适用于以下学生。 I think there's a mistake with that fscanf.我认为 fscanf 有问题。 Can anybody help?有人可以帮忙吗?

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;
}

Edit: the data looks like:编辑:数据看起来像:

matricola nome cognome n.esami`<eol>`
(for n.esami-rows)codice esame voto`<eol>`
...

Not clear but it seems the file contains a mix of line that have either four or two items.不清楚,但似乎该文件包含有四项或两项的混合行。
Consider reading each line.考虑阅读每一行。 Parse the line into up to four strings using sscanf.使用 sscanf 将该行解析为最多四个字符串。 As needed use sscanf to capture the integers from the line.根据需要使用sscanf从行中捕获整数。 If there are two items, process them if trovato flag indicates a match has been found.如果有两个项目,则在trovato标志指示已找到匹配项时处理它们。 If there are four items, see if there is a match and set 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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM