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