你好,我正试图从一个文件中读取,使电影的链接列表。在读文件函数的末尾,当我试图释放行指针并关闭文件时,我得到了一个seg错误和核心转储。释放和关闭文件都会引起问题。我欣赏一些洞察力。我需要图书馆吗?fopen工作得很好。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct movie {
char *title;
char **languages;
int year;
double rating;
struct movie *next;
};
struct movie *read_file(const char *filename);
struct movie *create_movie(const char *title, const char **languages, int year, double rating);
void append_movie(struct movie *head, struct movie *new_movie);
void free_movie(struct movie *movie);
int main() {
const char *filename = "movies_sample_1.csv";
struct movie *head = read_file(filename);
while (head != NULL) {
struct movie *temp = head;
head = head->next;
free_movie(temp);
}
return 0;
}
struct movie *read_file(const char *filename) {
FILE *file = fopen(filename, "r");
if (file == NULL) {
perror("Error opening file");
exit(1);
}
struct movie *head = NULL;
char *line = NULL;
size_t len = 0;
ssize_t nread;
if ((nread = getline(&line, &len, file)) == -1) {
perror("Error reading header");
exit(1);
}
while ((nread = getline(&line, &len, file)) != -1) {
char *title = strtok_r(line, ",", &line);
char *year_str = strtok_r(NULL, ",", &line);
char *languages_str = strtok_r(NULL, ",", &line);
char *rating_str = strtok_r(NULL, ",", &line);
int year = atoi(year_str);
double rating = atof(rating_str);
const char *languages[10];
int language_count = 0;
char *language = strtok_r(languages_str, ";[]", &languages_str);
while (language != NULL) {
languages[language_count++] = language;
language = strtok_r(NULL, ";[]", &languages_str);
}
languages[language_count] = NULL;
struct movie *new_movie = create_movie(title, languages, year, rating);
if (head == NULL) {
head = new_movie;
} else {
append_movie(head, new_movie);
}
}
// if (line != NULL) {
// free(line);
// }
//fclose(file);
return head;
}
struct movie *create_movie(const char *title, const char **languages, int year, double rating) {
struct movie *new_movie = (struct movie *)malloc(sizeof(struct movie));
if (new_movie == NULL) {
printf("Memory allocation failed");
exit(1);
}
new_movie->title = strdup(title);
if (new_movie->title == NULL) {
printf("Memory allocation failed");
exit(1);
}
new_movie->year = year;
new_movie->rating = rating;
int num_languages = 0;
while (languages[num_languages] != NULL) {
num_languages++;
}
new_movie->languages = (char **)malloc(sizeof(char *) * (num_languages + 1));
if (new_movie->languages == NULL) {
printf("Memory allocation failed");
exit(1);
}
for (int i = 0; i < num_languages; i++) {
new_movie->languages[i] = strdup(languages[i]);
if (new_movie->languages[i] == NULL) {
printf("Memory allocation failed");
exit(1);
}
}
new_movie->languages[num_languages] = NULL;
new_movie->next = NULL;
return new_movie;
}
void append_movie(struct movie *head, struct movie *new_movie) {
struct movie *current = head;
while (current->next != NULL) {
current = current->next;
}
current->next = new_movie;
}
void free_movie(struct movie *movie) {
free(movie->title);
for (int i = 0; movie->languages[i] != NULL; i++) {
free(movie->languages[i]);
}
free(movie->languages);
free(movie);
}
1条答案
按热度按时间crcmnpdw1#
可能会有更多的问题,但这里至少有一个...
getline
将为line
分配动态内存。您必须稍后通过调用free(line)
来释放该内存。为了做到这一点,你必须确保line
没有改变,即。从getline
得到的值line
是要传递给free
的值。但你
因此
line
的值可能/将被改变,并且free(line)
将(最有可能)失败。解决方案:为
strtok_r
状态使用另一个char指针。