Konahrik16 Ответов: 1

Как хранить элементы в 2D-массиве символов и печатать их (при чтении из файла)


Это довольно сложная проблема (по крайней мере, для меня), поэтому откровенно со мной, пока я ее объясняю.

Начальная задача состоит в том, чтобы прочитать данные из базы данных студентов, найти тип студента (например, европейский, международный, финансируемый и т. д.) и отсортировать в алфавитном порядке по имени.

Для начала я прочитал из каждого отдельного файла строку за строкой с помощью fgets() и проанализировал каждую строку с помощью sscanf (), чтобы сохранить фамилию и имя студентов в указанных переменных.

Наконец, я использовал fprintf (), чтобы записать каждый файл в один файл, который содержит все имена студентов в табличном формате.

Пока все достаточно просто.

Теперь начинается самое сложное.

Чтобы сохранить все имена из Объединенного файла, я использовал 2D-массив символов. Это 2D, потому что мне нужно хранить каждый номер строки и #define BUFFER, чтобы указать, сколько символов в строке.

Теперь мне нужно передать 2D-массив функции для поиска студента и сортировки списка. Я дал ему попробовать, но я могу заставить его отображать только одно имя или случайные символы.

Ниже приведены фрагменты моего кода до сих пор...

Что я уже пробовал:

void parse_file_and_sort(void)
{
    FILE *fp = fopen("Combined.dat", "rb");
    // 2D array
    static char student[SIZE][BUFFER];

    unsigned short total;
    unsigned short i = 0;

    char input;
    char search_key[KEY_ID];

    if (fp != NULL)
    {
        while((fgets(student[i], BUFFER, fp)) != NULL)
        {
            // remove newline 
            if (student[i][strlen(student[i] - 1)] == '\n')
            {
                student[i][(strlen(student[i]) - 1)] = '\0';
                i++;
            }
        } // end while

        total = i;

        for(i = 0; i < total; i++)
        {
            // remove headings
            if (i == 0)
            {
                student[i][i] = '\0';
            }
        } // end for

        // close file stream
        fclose(fp);
        
        // passing array to function which will search for a keyword
        linear_search(student);
}

void linear_search(char student[][BUFFER])
{
    unsigned short i;

    for(i = 0; i < SIZE; i++)
    {
        printf("%-2u | %s\n", i, student[i]);
    }
}

1 Ответов

Рейтинг:
11

OriginalGriff

Начните с того, что не используйте 2d-массив: создайте структуру Student и создайте связанный список (или массив только в том случае, если известно максимальное количество студентов) для их хранения.
Структура Student имеет отдельные указатели для FirstName, LastName, Type.
Не утруждайте себя сохранением длины имени, просто null завершает каждое и наклоняет его к этому.

Каждый раз, когда вы читаете строку, разбирайте ее на новый экземпляр Student и добавляйте его в свою коллекцию. Создайте функцию, которая принимает строку (строку) и возвращает указатель на нового ученика.

Сортировка-это просто вопрос замены указателей на объект Student Struct!

Поиск - это просто поиск по списку.

Если вы пишете функцию, которая принимает два указателя студента A & B и возвращает -1 для большего, чем B, 0 для равного и 1 для меньшего, чем B, вы можете использовать ту же функцию для сортировки и поиска!

Есть смысл? Дайте ему попробовать!


Konahrik16

Это имеет смысл и звучит просто! Я попробую это в следующей программе!

На этом я зашел слишком далеко по маршруту 2D-массива. Есть ли у вас какие-либо идеи относительно того, почему он отображает случайные данные или просто фамилию в списке?

OriginalGriff

Серьезно, выбрось его!
Самое трудное в жизни разработчиков-это осознать, когда достаточно и что-то просто не так. Работа, вложенная в идею, движется в неправильном направлении, и это приведет к ухудшению кода - труднее заставить работать, труднее поддерживать - поэтому быстрее, проще и гораздо лучше выбросить его и начать все сначала.
Поверьте мне на слово, мне все еще трудно "отпускать" время от времени!

Konahrik16

Спасибо за совет ;)