Bonjour à tous,
Je suis en train de coder un programme pour lire les .txt d'un dossier. Ces textes ont la forme suivante : "nom_compteur.txt". Le programme renvoie alors les adresses des textes dont les noms font parties d'une liste et dont les compteurs sont les plus élevés.
Mais le programme crash au niveau de readdir (par moment) et à la fin avant de retourner les adresses. Est-ce que vous auriez une idée de comment éviter ces problèmes? Je ne maitrise pas forcement toutes les subtilités pour les allocations mémoires
J'utilise Microsoft Visual Studio pour compiler et je suis sous Win32 ; les headers appelés sont les suivants :
La structure du repertoire :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <string> #include <cstring> #include <cstdlib> #include <stdlib.h> #include <chrono> #include <vector> #include "dirent.h" #include <windows.h> #include <sstream> #include <iterator> #include <iostream> #ifndef WIN32 #include <sys/types.h> #endif
Voici le code :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 typedef struct repertoire { std::vector<std::string> adresse; std::vector<int> compteur; };
Toute aide est la bienvenue parce que là je sèche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 void lecture_repertoire(std::vector <string> list, std::string adresse, repertoire *repertoire) { std::vector<std::string> files; struct dirent* entry; DIR* dir = NULL; // Ouverture du dossier à l'adresse spécifiée dir = opendir(adresse.c_str()); if (dir == NULL) { // Si le dossier n'existe pas, alors le programme renvoie "j" adresses construites avec le vecteur "list" for (int j = 0; j < list.size(); j++) { std::string file_name(adresse + list[j] + "_1" + ".txt"); repertoire->adresse[j] = file_name; } } else { // Si le dossier existe alors le programme construit un vecteur d'adresses "files" lues dans le dossier while ((entry = readdir(dir)) != NULL) { if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0 && strcmp(entry->d_name, "Old") != 0) { files.push_back(entry->d_name); } // Crash par moment ici } closedir(dir); // Le programme construit ensuite "j" adresses dans répertoire avec le vecteur d'adresse et la list ; il veille à ce que les adresses soient la dernière version (à partir du compteur) for (int j = 0; j < list.size(); j++) { repertoire->compteur[j] = 1; std::string tmp; for (int i = 0;i < files.size();i++) { std::string name1; std::string name2; std::size_t ext_pos; int str2; name1 = files[i]; name2 = files[i]; // name1 et name2 sont les adresses de files et sont découpées pour isoler le compteur/version du fichier et le nom ext_pos = name1.find_last_of('_'); name1 = files[i].substr(0, ext_pos); name2 = files[i].substr(ext_pos + 1); ext_pos = name1.find_last_of('/'); name1 = name1.substr(ext_pos + 1); ext_pos = name2.find_last_of('.'); name2 = name2.substr(0, ext_pos); sscanf_s(name2.c_str(), "%i", &str2); if (name1 == list[j] && str2 > repertoire->compteur[j]) repertoire->compteur[j] = str2; // On note la dernière version/compteur du fichier } tmp = std::to_string(repertoire->compteur[j]); std::string temp = list[j]; std::string file_name(adresse + temp + "_" + tmp + ".txt"); // Crash ici repertoire->adresse[j] = file_name; // On construit "j" adresses dans répertoire à la dernière version } } files.clear(); }
Mango1
Partager