C - больший вывод, чем у меня в файле (проблема размера) - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть файл в формате:

Курс - Количество оценок - Оценки

Programming 10 3 4 5 4 3 2 4 5 2 3
Mathematics 8 3 3 4 5 3 2 2 3
Physics 6 3 4 5 3 4 5
Design 6 5 4 5 3 2 4
Logistics 8 3 4 5 3 1 1 2 4

Пример: Курс - Программирование, Количество оценок - 10 и Оценки - 3 4 5 4 32 4 5 2 3

У меня уже есть

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

#define SIZE 70

int main(void)
{
    char subject[SIZE];
    int gradeCount;
    int grades[SIZE];

    FILE *fp = fopen("C:\\Project\\project.txt", "r"); //opening already created file


    if (fp == NULL) {
        perror("Error opening file");
        return(-1);
    }

    for (int i = 0; i < SIZE; i++) {

        fscanf(fp, "%s %d", &subject[i], &gradeCount);
        printf("%s \n", &subject[i]);
        //printf("%d \n", gradeCount);
        for (int k = 0; k < gradeCount; k++)
        {
            fscanf(fp, "%d", &grades[k]);
            // printf("%d \n" , grades[k]);

        }

        if (i == SIZE) {
            break;
        }
    }

    fclose(fp);
    return 0;
}

Мне нужно без проблем распечатать "Курс", "Подсчет оценок" и "Оценки", позже мне нужно сделатьпоиск, и поэтому мне нужно отделить их друг от друга, но это не так, теперь я покажу вам результаты для всех случаев, когда я вывожу сначала «Предмет / курс», затем «Подсчет оценок» и, наконец, «Оценки».

Для курсов:

Programming
Mathematics
Physics
Design
Logistics
ogistics
gistics
istics
stics
tics
ics
cs
s

@

@@
@
@

Для оценок:

10
8
6
6
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8
8

И для классов:

3
4
5
4
3
2
4
5
2
3
3
3
4
5
3
2
2
3
3
4
5
3
4
5
5
4
5
3
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4
3
4
5
3
1
1
2
4

Во всех случаях дополнительныевещи добавляются к оригинальному материалу, который должен быть распечатан, я не знаю, откуда он, я думал об указателях, но не знаю о них много.Какие-либо предложения?

Просто нужно распечатать все как обычно, чтобы потом все нормально искать (Курсы, подсчет оценок и оценки).

1 Ответ

0 голосов
/ 21 ноября 2018

Вам нужно выйти из цикла как можно раньше, если он не может ничего прочитать. Вы можете сделать это, проверив возвращаемое значение fscanf.Если первый вызов не возвращает 2, вы знаете, что он не считал 2 значения и может break выйти из цикла.

Вы также неправильно вызываете fscanf и printfдля работы со строкой.Вы перемещаете начальную точку, из которой вы читаете в / печатаете, что не нужно и уменьшает максимально доступное вам пространство.

Обновленный код выглядит примерно так

for (int i = 0; i < SIZE; i++) {
    if(fscanf(fp, "%s %d", subject, &gradeCount) != 2) {
        break;
    }

    printf("%s ", subject);
    //printf("%d \n", gradeCount);
    for (int k = 0; k < gradeCount; k++)
    {
        fscanf(fp, "%d", &grades[k]);
        // printf("%d" , grades[k]);
    }
}
...