programme donne résultat inattendu

bezin

Habitué
salut,

le but du programme est de mémoriser le nom des sous fichiers et dossiers d'un repertoire racine dans une liste.
le programme suivant roule mais le résultat est faux.
autrement dit si le dossier racine, par exemple, contient 3sous dossiers D1, D2, et D3, et que D3 est le dernier à être lu, l'affichage du contenu me donnera: D3 D3 D3:

[cpp]#include <dirent.h>
#include <iostream.h>
#include <conio.h>
#include <stdio.h>

void main()
{ DIR *p;
struct dirent *ent;
char **liste,*A,*B,*C;
int i=0;
liste = new(char*);
// ouverture du dossier racine
p=opendir("C:\\Racine");
// remplir la liste avec le nom des sous dossiers et sous fichiers
while ((ent = readdir(p)) != NULL)
{
if(*(ent->d_name)!='.' && *(ent->d_name)!='..')
{
*(liste+ i)= ent->d_name;
//vérification du contenu de liste
printf("\n%s\n",*(liste+ i++));
// ce printf affiche le nom du sous dossier correctement
}
}
// vérifier le contenu de la liste après l affectation
cout<<"contenu de la liste \n";
for(int j=0; j<i;j++)
printf(" %s \t",*(liste +j));
getch();

}[/cpp]

merci
 

KangOl

Grand Maître
c'est du c ou du c++ ?

parce que si c'est du C++ : std::vector < std::string > :o
 

braindeadbzh

Grand Maître
[cpp]
#include <dirent.h>
#include <conio.h>
#include <iostream>
#include <vector>

using namespace std;

void main()
{
DIR *p;
struct dirent *ent;
vector<string> liste;
// ouverture du dossier racine
p=opendir("C:\\Racine" );
// remplir la liste avec le nom des sous dossiers et sous fichiers
while ((ent = readdir(p)) != NULL)
{
if(*(ent->d_name)!='.' && *(ent->d_name)!='..')
{
liste.push_back(ent->d_name);
}
}
// vérifier le contenu de la liste après l affectation
cout<<"contenu de la liste \n";
for(int j=0; j<i;j++)
cout << liste[j] << endl;
getch();
}[/cpp]

PS : KangOl à raison, il ne faut pas mélanger les lib du C avec celle du C++ (par exemple si tu utilise des cout, n'utilise plus les printf, pareil pour getch() il y a surement moyen d'utiliser a la place un cin). Pour être sur du faire du C++, tous tes includes doivent être donnés sans le ".h" à la fin.
 

KangOl

Grand Maître
vire moi cette ligne 6
si on cree des namespace c'est pas pour les faire sauter :o

Pour être sur du faire du C++, tous tes includes doivent être donnés sans le ".h" à la fin
faux
c'est uniquement valable pour la stdlib
le standard c'est .hpp
 

batchy

Grand Maître
ligne 18 : hein ???? depuis quand '..' est un caractère ?
puis sinon vos getch() ne sont pas standard.
 

zeb

Modérateur
(Quand je vois des include <conio.h> dans du code C++, j'ai envie de me mettre au jardinage)
 

braindeadbzh

Grand Maître
@KangOl : mettre des "using namespace" ne veut pas dire que l'on fait sauter les namespace, c'est juste pour evité d'avoir des "std::" partout. Quand je programme j'aime bien utiliser les namespace pour "packager" mon code (par exemple MyLib::Core:: ou MyLib::Math::) alors si tu crois que je vais m'amuser à mettre ça devant chaque nom de classe, ça ferait que rendre le code illisible.

@Batchy et zeb : je vous rassure les mecs je code pas comme ça d'habitude (j'utilise que la STL) c'est juste que la j'ai codé ça rapidement directement dans le poste et j'étais fatigué donc j'ai pas cherché à corriger toutes les erreurs, seulement celles qui posai problème dans l'exécution.
 

KangOl

Grand Maître
Code:
[...]
namespace KangOl {
   class vector {
         [...]
   };
}[...]

Code:
#include <vector>
#include "KangOl.hpp"

using namespace std;
using namespace KangOl;

int main() {
   vector v;
   return 0;
}

tu crois que le compilo va accepter ?

si on package le code c'est uniquement pour eviter les conflits. alors pourquoi faire sauter ces protections ?
 

braindeadbzh

Grand Maître
Tu ne fais pas sauter les protections, pour les classes pour lequel le compilo à un conflit tu utilise la résolution de portée.
[cpp]
#include <vector>
#include "KangOl.hpp"
using namespace std;
using namespace KangOl;

int main() {
KangOl::vector v;
return 0;
}
[/cpp]

Comme ça pour les autres classes des namespace qui sont pas en conflit tu n'as pas à alourdir ton code avec des résolution de portée inutile. Mais bon, il y a autant de façon de codé que de codeur donc tu fais comme tu veux après.
 

KangOl

Grand Maître
et si il n'y a pas conflit
dans un fichier tu va utiliser vector en ayant importer le namespace std et dans un autre en ayant import le namespace KangOl. bonjour la lisibilité ! comment tu sais de quel vector il s'agit, tu va parcourir tout fichier a la recherche d'un using qui traine quelque part...

non, franchement le using n'est pas a utiliser pour autre chose qu'un "Hello World"
 

bezin

Habitué
merci BraindeadBZH
ce que tu as proposé marche très bien... on venait de voir le truc des vectors, donc je ne maitrise pas très bien... mais sinon j'ai compris ... :bounce: youpi lol

ligne 18 : hein ???? depuis quand '..' est un caractère ?
parmis les char que retourne readdir, tu trouveras ". " et ".." ;


(Quand je vois des include <conio.h> dans du code C++, j'ai envie de me mettre au jardinage)

zeb, je suis désolée si je ne suis pas aussi parfaite que tu parrais l'être, ce qui est tout à ton honneur, mais ce que je demande c'est apprendre...

pour ce qui suit dans la discussion sur les namespace et tout ça, je suis larguée... je n'ai rien compris :sweat: ... mais c'est très interressant de vous lire...
thanks :merci:


 

zeb

Modérateur
Meuh non je ne suis pas parfait.
Tu mélanges tout, c'est tout : Honte sur .... tes profs :o
 

bezin

Habitué
lol plutôt honte sur moi...
si j'avais posé les bonnes questions , j'aurais eu les bonnes réponses :)

en fait , question lol:
si on déclare une variable de la sorte:

[cpp]std::vector<std::string> var[/cpp]
on ne peut pas utiliser cin?

[cpp]cin>>var;[/cpp]

:sweat:

 

braindeadbzh

Grand Maître
Non je ne pense pas car l'opérateur >> ne doit pas être défini pour le type vector. Mais je pense que tu peux écrire :
[cpp]std::cin >> var[0];[/cpp]

PS : Oublie pas les std:: sinon tu vas te faire te faire ramasser KangOl ;).
 

bezin

Habitué
lol
et oui j'ai déja essayé mais on me dit que cin n'est pas un membre de std
 

braindeadbzh

Grand Maître
C'est peut-être que tu utilises <iostream.h> à la place de <iostream>.
 

bezin

Habitué
non, je viens de vérifier
voila le code avec lequel je teste:

[cpp]#include <vector>
#include <iostream>
#include <string>
using namespace std;
void main()
{
std::vector<std::string> var;
std::cin>>var[0];
}[/cpp]
 

braindeadbzh

Grand Maître
Mais ce test la, il compile bien?

Du coup si tu mets des std:: supprime la ligne
Code:
using namespace std;
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 132
Messages
6 718 000
Membres
1 586 387
Dernier membre
ouistititouille
Partager cette page
Haut