Возникли проблемы с анализом файла на C

#c #linux #file-io

Вопрос:

Я пытаюсь написать программу, которая автоматически открывает ссылку google classroom на класс, который у меня есть за две минуты до его начала. До сих пор я решил создать файл tsv с тремя столбцами: Время, Тема, ссылка Gmeet соответственно. примерно так:

 [1]
11:15   CD  https://en.wikipedia.org/wiki/Inotify
14:00   SGD https://en.wikipedia.org/wiki/Inotify
15:05   SGD https://en.wikipedia.org/wiki/Inotify

[2]
09:00   AI  https://en.wikipedia.org/wiki/Inotify
 

Цифры в квадратных ячейках соответствуют дню недели.
Поэтому я планирую сохранить расписание дня в массиве размером 9, поскольку в любой день у меня могут быть занятия в 9 разных временных интервалах, при этом ссылка каждого класса находится в индексе[час — 9]. Таким образом, первый класс в 9 утра будет иметь нулевой индекс, а пустые временные интервалы будут иметь значение null.

Вот как выглядит код:

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

const char FILE_NAME[] = "schedule.txt";
const int CLASSES = 9;

int main()
{
    time_t now = time(NULL);
    struct tm *local = localtime(amp;now);

    FILE *file = fopen(FILE_NAME, "r"); /* Input file */

    char line[100];
    int hour;
    char *min;
    char *sub;
    char *link;
    /* char current_day = local->tm_wday; */
    char current_day = 1;
    char *sched[CLASSES];

    if (file == NULL) {
        printf("Cannot open file: "%s"n", FILE_NAME);
        exit(8);
    }

    for (int i = 0; i < CLASSES;   i)
        sched[i] = NULL;

    char dayfound = 0;
    while(fgets(line, sizeof(line), file)) {
        if ((line[0] == '[' amp;amp; atoi(amp;line[1]) == current_day)) {
            dayfound = 1;
            continue;
        }
        if (dayfound amp;amp; line[0] == 'n') {
            dayfound = 0;
            break;
        }
        if (dayfound) {
            hour = atoi(strtok(line, ":"));
            min = strtok(NULL, "t");
            sub = strtok(NULL, "t");
            link = strtok(NULL, "t");
            sched[hour - 9] = link;
        }
    }

    for (int i = 0; i < CLASSES;   i) {
        if (sched[i] != NULL)
            printf("%s", sched[i]);
    }


    fclose(file);
    return 0;
}
 

По какой-то причине значение первого класса, которое у меня есть в тот день, перезаписывается пустой строкой, и я получаю только ссылки двух других классов.

Это и есть результат:

 https://en.wikipedia.org/wiki/Inotify
https://en.wikipedia.org/wiki/Inotify
 

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

Комментарии:

1. Сообщения об ошибках должны быть информативными и записываться в stderr. Попробуй if (file == NULL) { perror(FILE_NAME); exit(EXIT_FAILURE); }

2. link = strtok(NULL, "t"); sched[hour - 9] = link; записывает указатель на местоположение буфера в ваш массив: этот буфер будет перезаписан следующим fgets() — посоветуйте strdup() , например, использовать sched[hour - 9] = strdup(link);

Ответ №1:

Вы читаете одну и ту же line строку для каждой строки файла. strtok() возвращает указатель на эту строку. Таким образом, все ваши link значения указывают на одну и ту же строку.

Вы должны сделать копию link при назначении его sched[hour-9] :

 sched[hour - 9] = strdup(link);
 

Или вы можете создать sched 2-мерный массив и использовать strcpy()

 char sched[CLASSES][100];
...
strcpy(sched[hour - 9], link);