Dans mon code, je dois construire une fonction qui va analyser le contenu d'un fichier et le transformer en structures. Le problème est que dans cette fonction en particulier, lors de la première boucle du while, la fonction résultats va avoir la bonne valeur dans le tableau titres mais dès que la nouvelle ligne est lue ( fgets(ligne, MAX_LINE_LENGTH, fichier) ), et la valeur de ligne change, la valeur dans résultats->titres change aussi. Je suis relativement novice en C et je n'arrive pas à comprendre pourquoi, car mes fonctions fonctionnent ailleurs. voir la fin de l'article ). J'ai l'impression que c'est lié à ma compréhension limitée des pointeurs, mais je n'arrive pas à trouver comment résoudre ce problème !
Si quelqu'un pouvait m'aider, ce serait très apprécié !
######## Code ########
structures : Je n'ai pas tout inclus mais les deux structures ont des getters et setters ainsi qu'un constructeur et destructeur.
struct titre {
char* tconst;
char* primaryTitle;
char* genres;
char* titleType;
int startYear;
};
typedef struct titre* t_titre;
struct resultats {
int size;
t_titre titres;
};
typedef struct resultats* t_resultats;
t_titre creer_titre(void) {
t_titre titre;
titre = (t_titre) malloc(sizeof(struct titre));
memset(titre, 0, sizeof(*titre));
if (titre) {
titre->tconst = NULL;
titre->primaryTitle = NULL;
titre->genres = NULL;
titre->titleType = NULL;
titre->startYear = -1;
}
return titre;
}
...
void set_tconst(t_titre titre, char* tconst) {
titre->tconst = tconst;
}
...
La mise en œuvre ne fonctionne pas :
#include "imdb.h"
#define MAX_LINE_LENGTH 128
void parse_line(t_titre titre, char* line);
void filter_results(t_resultats results, t_critere filter);
t_resultats search_file(t_critere criteres, char* file_name) {
FILE* file = fopen(file_name, "r");
t_resultats resultats = creer_resultats();
t_titre titre = creer_titre();
if (file == NULL) {
printf("Couldn't open file %s\n", file_name);
exit(EXIT_FAILURE);
}
char line[MAX_LINE_LENGTH];
fgets(line, MAX_LINE_LENGTH, file); //Skip header line
while (fgets(line, MAX_LINE_LENGTH, file)) {
parse_line(titre, line);
add_titre(resultats, titre);
}
free(titre);
fclose(file);
return NULL;
}
void parse_line(t_titre titre, char* line) {
line[strcspn(line, "\n")] = 0; //Remove trailling \n
set_tconst(titre, strsep(&line, "\t"));
set_titleType(titre, strsep(&line, "\t"));
set_primaryTitle(titre, strsep(&line, "\t"));
strsep(&line, "\t"); //Skip originalTitle
strsep(&line, "\t"); //Skip isAdult
set_startYear(titre, strtol(strsep(&line, "\t"), NULL, 10));
strsep(&line, "\t"); //Skip endYear
strsep(&line, "\t"); //Skip runtimeMinutes
set_genres(titre, line); //Use remaining of line as it is the last value
}
void filter_results(t_resultats results, t_critere filter) {
}
Mise en œuvre du travail :
t_resultats resultats = creer_resultats();
t_titre t = creer_titre();
set_tconst(t, "tt0000001");
set_titleType(t, "short");
set_primaryTitle(t, "It");
set_startYear(t, 2015);
set_genres(t, "Horror,Short");
add_titre(resultats, t);
set_tconst(t, "tt0000002");
set_titleType(t, "short");
set_primaryTitle(t, "ET");
set_startYear(t, 2015);
set_genres(t, "Horror,Short");
add_titre(resultats, t);
set_tconst(t, "tt0000003");
set_titleType(t, "short");
set_primaryTitle(t, "Interstellar");
set_startYear(t, 2015);
set_genres(t, "Sci-Fi,Short");
add_titre(resultats, t);