#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);