Чтение файла в C и сохранение данных в массивах

Мой код ниже читает файл на C. Он отображает файл, средний балл, максимальный балл и имена всех студентов, набравших максимальный балл. Экзаменационные баллы (формат 0–100 с точностью до 1 знака после запятой и использование ширины поля столбцов) хранятся в массиве, а имена (имя и фамилия ограничены 15 символами) хранятся в двумерном массиве символов, который параллельно массиву scores. Мои проблемы:

1) Код неправильно читает (распечатывает) файл (думаю, это связано с fscanf и массивами).

2) Мои две функции не печатают результаты.

Любое предложение приветствуется, спасибо.

#include "tools.h"
#define MAX 30                  // Maximum number of students
int computeMax(double stSco[], int numSt);  // Gets the average and highest
                                            // score
void outputBest(double num[], char nameHg[][15], int hgPl, int totStu);

int main()
{
    double score[MAX];
    char name[MAX][15];
    char fileName[80];
    int k, count = 0, hgCt;
    stream dataFile;
    banner();
    printf("Type the name of file you want to read\n");
    scanf("%79[^/n]", fileName);
    dataFile = fopen(fileName, "r");
    if (dataFile == NULL)
    {
        fatal("Cannot open %s for input", fileName);
    }
    while (!feof(dataFile))
    {
        fscanf(dataFile, "(%lg,%s)", &score[k], &name[k]);
        printf("%6.1f %s\n", score[k], name[k]);
        count++;                // It counts how many students there are
    }
    hgCt = computeMax(score, count);    // Stores the value sent by the
                                        // function
    outputBest(score, name, hgCt, count);
    fclose(dataFile);
    bye();
    return 0;
}

int computeMax(double stSco[], int numSt)
{
    int k, maxScore = 0, sum = 0;
    double maximum = 0, average = 0;

    for (k = 0; k < numSt; k++)
    {
        sum += stSco[k];        // It sums all scores
        if (stSco[k] > maximum)
        {
            maximum = stSco[k];
            maxScore = k;       // Stores the index of the maximum score
        }
    }
    average = sum / numSt;
    printf("The average score is %d\n", average);
    printf("The maximum score is %d\n", maximum);
    return maxScore;
}

void outputBest(double num[], char nameHg[][15], int hgPl, int totStu)
{
    int k;
    for (k = 0; k < totStu; k++)
    {
        if (num[k] = hgPl)
        {                       // It finds who has the highest score
            printf("%s got the highest score\n", nameHg[k]);
        }
    }
}

person Cesar    schedule 20.09.2013    source источник


Ответы (1)


Во-первых: scanf("%79[^/n]",fileName); должно быть scanf("%79[^\n]",fileName);, лучше использовать fgets().

Вторая опечатка: неправильно написано == на = в условии if()

 if(num[k]=hgPl){ //It finds who has the highest score
 //       ^ = wrong 

должно быть:

 if(num[k] == hgPl){ //It finds who has the highest score

Изменить:

Ошибка в цикле while..

fscanf(dataFile, "(%lg,%s)", &score[k], &name[k]);
//                ^   ^  ^  remove      ^

должно быть:

fscanf(dataFile, "%lg%14s", &score[k], name[k]);

и увеличьте k в цикле while. после printf("%6.1f %s\n", score[k], name[k]);.

person Grijesh Chauhan    schedule 20.09.2013
comment
Спасибо за ваш ответ @Grjesh. Я внес изменения, но когда я запускаю программу, она печатает как в бесконечном цикле. - person Cesar; 21.09.2013
comment
@Cesar Это что-то выводит? И он переходит в бесконечный цикл сразу после того, как вы вводите какое-то значение? - person Grijesh Chauhan; 21.09.2013
comment
@Cesar, кстати, что такое bye();? - person Grijesh Chauhan; 21.09.2013
comment
@Cesar, это не бесконечный цикл, но, как я предполагаю, его структура в функции fscanf(), потому что вы используете ненужные символы в строке форматирования: Прочитайте обновленный ответ, отредактируйте часть. Чтобы узнать об этом, прочитайте: Сохранить данные в массиве из ввода - person Grijesh Chauhan; 21.09.2013
comment
После ввода пути к файлу отображаются длинные строки необычных символов, которые печатаются быстро один за другим (бесконечный цикл). - person Cesar; 21.09.2013
comment
@ Grijesh После ввода пути к файлу отображаются длинные строки необычных символов, которые быстро печатаются один за другим (бесконечный цикл). - person Cesar; 21.09.2013
comment
Я только что сделал изменение, которое вы мне предложили. Теперь он печатает оценку и имя (не фамилию) только первого ученика и повторяет это несколько раз (без конца). - person Cesar; 21.09.2013
comment
@Cesar, это потому, что вы не увеличиваете k в цикле while, теперь снова читайте обновленный ответ. - person Grijesh Chauhan; 21.09.2013
comment
Когда я увеличиваю k, он правильно печатает только первую строку. После этого он печатает кучу бессмысленных строк символов. - person Cesar; 21.09.2013
comment
@Cesar может быть из-за неопределенного поведения, увеличьте значение MAX и MAX = 200, double score[MAX]; char name[MAX][150]; - person Grijesh Chauhan; 21.09.2013