В вашей программе есть несколько ошибок.
Для начала:
char title = NULL;
char year = NULL;
char genre = NULL;
вместе с этим:
title = strtok_r(tekst, "|", &buffer);
year = strtok_r(NULL, "|", &buffer);
genre = strtok_r(NULL, "|", &buffer);
int year = atoi(year);
Вы определяете title
как char
, но strtok_r
возвращает char*
. Следовательно, вы перезаписываете память, сохраняя «указатель на символ» в переменной «символ».
Это может уничтожить файл-указатель. Полученная ошибка 0xC0000005 (как вы упоминаете в комментарии) может указывать на то, что:
Ошибка приложения 0xc0000005 (нарушение прав доступа) обычно вызывается тем, что ваш компьютер не может правильно обработать файлы ...
Измените определение на:
char *title = NULL;
char *year = NULL;
char *genre = NULL;
Далее:
year = strtok_r(NULL, "|", &buffer); // A variable named year
genre = strtok_r(NULL, "|", &buffer);
int year = atoi(year); // A NEW variable with same name!!
Измените его на:
year = strtok_r(NULL, "|", &buffer);
genre = strtok_r(NULL, "|", &buffer);
int yearN = atoi(year); // Use another name
Кроме того, перед вызовом atoi
всегда следует проверять, что
year
равно
, а не NULL.
Поэтому я предлагаю упростить ваш код для отладки. Попробуйте:
FILE *baza;
if ((baza = fopen("movies.txt", "r")) == NULL)
{
system("cls");
printf("Blad otwarcia pliku\n");
exit(1);
}
char tekst[512];
char* title = NULL;
char* year = NULL;
char* genre = NULL;
char* buffer = NULL;
int x = 0;
printf("while-loop start\n");
while (fgets(tekst, 512, baza) != NULL)
{
printf("%s", tekst);
//x++;
//title = strtok_r(tekst, "|", &buffer);
//year = strtok_r(NULL, "|", &buffer);
//genre = strtok_r(NULL, "|", &buffer);
//int year = atoi(year);
//title=movies[x]->title;
//year=movies[x]->year;
//genre=movies[x]->genre;
}
printf("while-loop complete\n");
Теперь проверьте вывод, полученный из этого кода. Если это работает, как ожидалось, вы можете начать комментировать строки один за другим.
В конце концов, я думаю, что ваша функция должна выглядеть так:
FILE *baza;
if ((baza = fopen("movies.txt", "r")) == NULL)
{
system("cls");
printf("Blad otwarcia pliku\n");
exit(1);
}
char tekst[512];
char* title = NULL;
char* year = NULL;
char* genre = NULL;
char* buffer = NULL;
int x = 0;
while (fgets(tekst, 512, baza) != NULL)
{
printf("%s", tekst);
title = strtok_r(tekst, "|", &buffer);
assert(title != NULL);
strcpy(movies[x]->title, title);
year = strtok_r(NULL, "|", &buffer);
assert(year != NULL);
movies[x]->year = atoi(year);
genre = strtok_r(NULL, "|", &buffer);
assert(genre != NULL);
strcpy(movies[x]->genre, genre);
x++;
}
Выше предполагается, что вы уже выделили память для всех указателей в movies
. Как:
struct movie { char title[100]; int year; char genre[100]; };
int main() {
int i = 0;
struct movie *movies[50];
for(i=0; i<50; ++i) movies[i] = malloc(sizeof *movies);
. . .