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 :

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
La structure du repertoire :

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;
};
Voici le code :

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();
}
Toute aide est la bienvenue parce que là je sèche

Mango1