Erreur lors de lecture/écriture d'un certain nb de fichiers [C++] - C++ - Programmation
Marsh Posté le 22-02-2005 à 14:28:30
Petite précision : je suis sous RedHat 9 et mon compilateur est GCC 3.2.2-5
Marsh Posté le 22-02-2005 à 14:30:06
hile(fichier.getline(str,10000))
c'est pas fini ces conneries ?
std::string line;
while(std::getline(fin, line)) { ... }
Marsh Posté le 22-02-2005 à 14:32:22
c'est ce que j'avais mis avant... mais ça ne fonctionnait pas mieux...
Marsh Posté le 22-02-2005 à 14:36:33
Voici ma fonction de lecture, corrigée :
Code :
|
Marsh Posté le 22-02-2005 à 14:47:36
J'ai tout passé en std::string... même erreur.
Ma fonction StrReplace permet de remplacer dans une chaine de caractères, un bout de chaine par une autre :
Code :
|
avec StrPos pour trouver la position d'un caractère dans une chaîne :
Code :
|
Marsh Posté le 22-02-2005 à 15:17:16
En fait j'ouvre une dizaine de fichiers, et j'en écris au total plus d'un milliers. C'est généralement aux alentours de 1000 fichiers écrits qu'il "plante" dans le sens où il ne parvient plus à ouvrir les fichiers en écriture dans SaveToFile :
Code :
|
renvoie NULL (alors que le fichier n'existe pas encore, et qu'il n'y aucune limitation d'accès à ce répertoire...)
Marsh Posté le 22-02-2005 à 15:22:28
Ma fonction SaveToFile renvoie :
Erreur d'ouverture en ecriture du fichier nom_fichier1098.txt
Erreur d'ouverture en ecriture du fichier nom_fichier1099.txt
Erreur d'ouverture en ecriture du fichier nom_fichier1100.txt
Erreur d'ouverture en ecriture du fichier nom_fichier1101.txt
Erreur d'ouverture en ecriture du fichier nom_fichier1102.txt
Erreur d'ouverture en ecriture du fichier nom_fichier1103.txt
Erreur d'ouverture en ecriture du fichier nom_fichier1104.txt
...
donc je me dis que fe est NULL non ?
Marsh Posté le 22-02-2005 à 15:23:18
c'est un pointeur fe ? d'où il sort ce message d'erreur ?
Marsh Posté le 22-02-2005 à 15:29:40
Dans SaveToFile :
Code :
|
mais ce n'est peut-être pas ainsi qu'on vérifie si un fichier est bien ouvert ?!
Marsh Posté le 22-02-2005 à 15:32:49
ulimit -n ?
ce que je comprends pas c'est pourquoi les descripteurs ne sont pas fermés ... tu ferais pas de la rétention de stream quelque part ?
Marsh Posté le 22-02-2005 à 15:37:39
[quote=989912,0,15,72553]ulimit -n ?
ce que je comprends pas c'est pourquoi les descripteurs ne sont pas fermés ... tu ferais pas de la rétention de stream quelque part ?[/quote]
ulimit -n me retourne 1024... donc 1024 fichiers avant bug ou je mélange tout ?!
Il est possible que je fasse de la rétention de stream, comment m'en assurer ??
Merci
Marsh Posté le 22-02-2005 à 15:41:29
genre tu maintiendrais pas une collection de stream ? ou tu ferais pas des new ofstream() ?
Marsh Posté le 22-02-2005 à 15:42:16
ah peut-être... enfin pas de new() ostream mais maintenir une collection?... Que veux-tu dire par là ?
Marsh Posté le 22-02-2005 à 15:51:05
non je ne fais pas de liste de vecteurs de fstream, ifstream ou ofstream... Par contre y'a-t'il une commande comme ulimit -n pour vérifier lors de l'exécution de mon programme s'il empile des streams sans les libérer au fûr et à mesure ?
Marsh Posté le 22-02-2005 à 15:55:31
Est-que tu as une fonction récursive quelque part ?
Marsh Posté le 22-02-2005 à 15:57:04
[quote=989973,0,22,21301]Est-que tu as une fonction récursive quelque part ?[/quote]
Oui, StrReplace (voir ci-dessus)
Marsh Posté le 22-02-2005 à 16:08:30
Code :
|
ça donne quoi ce genre de chose chez toi ?
find /etc -type f 2>/dev/null | ./a.out
par exemple
Marsh Posté le 22-02-2005 à 16:12:06
Il faut faire des close() avant d'entrer en récursion...
Marsh Posté le 22-02-2005 à 16:12:43
[quote=990029,0,25,21301]Il faut faire des close() avant d'entrer en récursion...[/quote]rien à voir, merci de lire le code.
Marsh Posté le 22-02-2005 à 16:12:57
Est-ce que cette fonction ne poserait pas problème par hasard ?
(en ne fermant pas le opendir)
Code :
|
Marsh Posté le 22-02-2005 à 16:14:23
[quote=990031,0,26,72553]rien à voir, merci de lire le code.[/quote]
J'te parle pas à toi.
Marsh Posté le 22-02-2005 à 16:15:10
il n'empêche
Marsh Posté le 22-02-2005 à 16:19:55
rapidement
Code :
|
Marsh Posté le 22-02-2005 à 16:21:09
[quote=990019,0,24,72553]
(...)
ça donne quoi ce genre de chose chez toi ?
find /etc -type f 2>/dev/null | ./a.out
par exemple[/quote]
me donne :
1000
Opened files : 1264
Marsh Posté le 22-02-2005 à 16:22:05
ouais, je pense vraiment que c'est ta fuite de ressources au niveau d'opendir. Tu as peut être d'autres fuites, mais en corrigeant ça tu devrais déjà aller plus loin
Marsh Posté le 22-02-2005 à 16:24:53
Faut-il inclure une unité pour utiliser stat comme tu le fais dans ton code de isDirectory ?
Marsh Posté le 22-02-2005 à 16:26:03
STAT(2) Manuel du programmeur Linux STAT(2)
NOM
stat, fstat, lstat - Obtenir le statut dun fichier (file status).
SYNOPSIS
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
c'était trop te demander d'ouvrir le manuel de stat ?
Marsh Posté le 22-02-2005 à 16:31:29
Désolé, je n'ai pas encore pris l'habitude de faire des man lorsque je programme sous Unix... Je développe la plupart de mes applications sous C++ Builder sous Windows, et là depuis peu en me plongeant dans du codage + standard et + propre sous Unix, j'ai un peu du mal pour chercher de l'aide etc...
Enfin bref, il est vrai que j'aurais pu trouver cette réponse tout seul.
Merci pour ton aide, c'était effectivement la fonction DirectoryExists() qui ouvrait des tas de stream sans les fermer...
Marsh Posté le 22-02-2005 à 16:33:04
perdu. ta fonction DirectoryExists ouvre des descripteurs de fichiers avec la fonction C POSIX opendir, et ne les referme pas.
Marsh Posté le 22-02-2005 à 16:39:38
oui enfin je m'étais compris à mon niveau...
merci pour ta correction.
Marsh Posté le 22-02-2005 à 14:26:10
Bonjour,
J'ai créé une classe StringList qui me permet de stocker dans un vecteur de string, des chaines de caractères.
Voici ma fonction de lecture :
Et voici ma fonction d'écriture :
Au bout d'un certain nombre de lectures/écritures (nombre aléatoire !!), mon programme plante et ne parvient plus à ouvrir de fichiers en écriture.
Je ne comprends pas du tout pourquoi ! Auriez-vous des pistes pour m'éclairer ?? Merci !
Message édité par benj63 le 22-02-2005 à 14:26:28