Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2897 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Lister les fichiers d'un répertoire : problème de portabilité?

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lister les fichiers d'un répertoire : problème de portabilité?

n°2005999
Wouzz
Qui n'a rien, ne risque rien
Posté le 30-06-2010 à 12:15:45  profilanswer
 

Bonjour à tous,
 
Je cherche à récupérer la liste de tous les fichiers présents dans un répertoire, en C++. De ce que j'ai lû jusqu'à présent, le code diffère selon l'environnement :
 

Code :
  1. // WIN32
  2. #include <stdio.h>
  3. #include <windows.h>
  4. int main(void)
  5. {
  6.     WIN32_FIND_DATA File;
  7.     HANDLE hSearch;
  8.    
  9.     hSearch = FindFirstFile("*.*", &File);
  10.     if (hSearch != INVALID_HANDLE_VALUE)
  11.     {
  12.         do {
  13.             printf("%s\n", File.cFileName);
  14.         } while (FindNextFile(hSearch, &File));
  15.        
  16.         FindClose(hSearch);
  17.     }
  18.    
  19.     return 0;
  20. }


 
 

Code :
  1. //POSIX
  2. #include <stdio.h>
  3. #include <dirent.h>
  4. int main(void)
  5. {
  6.     DIR * rep = opendir("." );
  7.    
  8.     if (rep != NULL)
  9.     {
  10.         struct dirent * ent;
  11.        
  12.         while ((ent = readdir(rep)) != NULL)
  13.         {
  14.             printf("%s\n", ent->d_name);
  15.         }
  16.        
  17.         closedir(rep);
  18.     }
  19.    
  20.     return 0;
  21. }


 
 
J'aimerais donc savoir comment faire pour intégrer ces deux portions de code à mon application et faire en sorte de détecter l'environnement pour exécuter le bon code? J'ai pensé à des macros, mais je n'en ai encore jamais utilisé, donc si quelqu'un a un exemple sur la façon de faire?...
 
Ou, encore mieux, un code portable qui m'évite d'avoir à détecter l'environnement?  :D  
 
Merci d'avance!

mood
Publicité
Posté le 30-06-2010 à 12:15:45  profilanswer
 

n°2006011
ptitchep
Posté le 30-06-2010 à 12:54:31  profilanswer
 

Salut

 

boost::filesystem est portable.

 

#include <stdio.h>
#include <dirent.h>
C'est du C, pas du C++.

Message cité 1 fois
Message édité par ptitchep le 30-06-2010 à 12:55:48

---------------
deluser --remove-home ptitchep
n°2006018
h3bus
Troll Inside
Posté le 30-06-2010 à 13:22:18  profilanswer
 

Bonjour,
 
j'ai déjà utilisé dirent sous WIN32 sans problème...


---------------
sheep++
n°2006243
ptitchep
Posté le 01-07-2010 à 10:29:24  profilanswer
 

Salut,
 
dirent doit fonctionner sous windows en effet. Mais c'est du C, pas du C++. Enfin le code posté est entièrement en C donc je ne sais pas trop ce que veut Wouzz.


---------------
deluser --remove-home ptitchep
n°2006245
Wouzz
Qui n'a rien, ne risque rien
Posté le 01-07-2010 à 10:41:04  profilanswer
 

ptitchep a écrit :

Salut
#include <stdio.h>
#include <dirent.h>
C'est du C, pas du C++.


ptitchep a écrit :

Salut,
dirent doit fonctionner sous windows en effet. Mais c'est du C, pas du C++. Enfin le code posté est entièrement en C donc je ne sais pas trop ce que veut Wouzz.


Certes mais le C++, c'est aussi du C  :ange:  
 

h3bus a écrit :

Bonjour,
j'ai déjà utilisé dirent sous WIN32 sans problème...


Testé et approuvé!
La prochaine fois j'essayerai avant de demander  :D  
 
Merci beaucoup. :)  

n°2006292
ptitchep
Posté le 01-07-2010 à 12:58:40  profilanswer
 

Wouzz a écrit :

Certes mais le C++, c'est aussi du C  :ange:


En aucun cas!!!
Je ne sais pas qui t'a mis cette con****ie  dans la tête mais oublie tout de suite.


---------------
deluser --remove-home ptitchep
n°2006303
Wouzz
Qui n'a rien, ne risque rien
Posté le 01-07-2010 à 14:01:53  profilanswer
 

Ce que je veux dire c'est qu'un code C passe avec un compilateur C++, et c'est tout ce qu'il me faut. :)

n°2006316
SquiZZ
Posté le 01-07-2010 à 14:31:59  profilanswer
 
n°2006317
Un Program​meur
Posté le 01-07-2010 à 14:37:23  profilanswer
 

Wouzz a écrit :

Ce que je veux dire c'est qu'un code C passe avec un compilateur C++, et c'est tout ce qu'il me faut. :)


 
Il y a un large sous-ensemble partage (un peu moins large avec C99), mais rares sont les programmes ecrits en C idiomatique qui compilent sans modification avec un compilateur C++.  (Pb n 1: le resultat de malloc() n'est traditionnellement pas caste en C, c'est une erreur en C++).


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2006348
ptitchep
Posté le 01-07-2010 à 15:23:45  profilanswer
 

Ouais ok ça marche mais bon il y a une bonne différence entre quelque chose qui marche et quelque chose de correct. On ne m'ôtera pas l'idée que si tu es obligé de compiler un programme en C avec un compilateur C++ c'est que tu ne sais pas ce que tu fais. Et quand on ne sait pas ce qu'on fait, ça finit rarement bien en programmation.


---------------
deluser --remove-home ptitchep
mood
Publicité
Posté le 01-07-2010 à 15:23:45  profilanswer
 

n°2006391
xilebo
noone
Posté le 01-07-2010 à 16:40:41  profilanswer
 

ptitchep a écrit :

Ouais ok ça marche mais bon il y a une bonne différence entre quelque chose qui marche et quelque chose de correct. On ne m'ôtera pas l'idée que si tu es obligé de compiler un programme en C avec un compilateur C++ c'est que tu ne sais pas ce que tu fais. Et quand on ne sait pas ce qu'on fait, ça finit rarement bien en programmation.


 
Ce n'est pas incorrect d'inclure du code C dans un programme C++. Parfois même, on n'a pas le choix (bibliothèques écrites en C par exemple).
 
D'ailleurs, la totalité des appels système sous linux sont en C. Qu'on les appelle directement ou en passant par une bibliothèque C++ qui les encapsule ne change rien.


Message édité par xilebo le 01-07-2010 à 16:41:38
n°2006395
ptitchep
Posté le 01-07-2010 à 16:46:51  profilanswer
 

Oui mais cette bibliothèque en C est compilée par un compilateur C.
Moi aussi j'utilise des bibliothèques C dans du code en C++. Au final ce n'est qu'une édition de lien. Le code C est compilé par un compilateur C et le C++ par un compilateur C++.

 

Et il y a quand même une grosse différence entre appeler des fonctions d'une bibliothèque codée en C (à la limite on s'en fiche de savoir en quoi elle est codée, on appelle juste les fonctions) et compiler avec g++ un code en C  (include <stdio.h>, dirent, printf). Un code comme ça compilé avec g++ c'est soit qu'il y a un mélange entre les 2 langages et que du coup ça ne compile pas avec gcc et on se dit bon ben avec g++ ça marche c'est cool, soit que l'on considère le C++ comme un "add on" du C qui permet le code objet.

Message cité 1 fois
Message édité par ptitchep le 01-07-2010 à 16:52:14

---------------
deluser --remove-home ptitchep
n°2006398
xilebo
noone
Posté le 01-07-2010 à 17:03:43  profilanswer
 

ptitchep a écrit :

Oui mais cette bibliothèque en C est compilée par un compilateur C.
Moi aussi j'utilise des bibliothèques C dans du code en C++. Au final ce n'est qu'une édition de lien. Le code C est compilé par un compilateur C et le C++ par un compilateur C++.
 
Et il y a quand même une grosse différence entre appeler des fonctions d'une bibliothèque codée en C (à la limite on s'en fiche de savoir en quoi elle est codée, on appelle juste les fonctions) et compiler avec g++ un code en C  (include <stdio.h>, dirent, printf). Un code comme ça compilé avec g++ c'est soit qu'il y a un mélange entre les 2 langages et que du coup ça ne compile pas avec gcc et on se dit bon ben avec g++ ça marche c'est cool, soit que l'on considère le C++ comme un "add on" du C qui permet le code objet.


 
 
Et la bibliothèque qui encapsule ça  (boost par exemple) , tu crois qu'elle fait comment ?  
 
Son code est parfaitement valide en C++, il ne s'agit que d'appels système C , donc d'une bibliothèque codée et compilée en C comme tu le précises.
 
 
 
 
 

n°2006407
ptitchep
Posté le 01-07-2010 à 17:25:11  profilanswer
 

xilebo a écrit :

une bibliothèque codée et compilée en C comme tu le précises.


Nous sommes donc d'accord, le C est compilé par un compilateur C.
 
Ok pour les appels systèmes de fichiers, je m'ai trompé. [Mode j'ai toujours raison]N'empêche qu'il existe des méthodes pratiques en vrai C++ (basés sur les mêmes appels systèmes codés en C  ;) )plutôt que de réinventer la roue.[/Mode j'ai toujours raison]
 
Pas ok pour stdio.h et printf. Pour moi ça trahit que tout le reste est pensé en C et compilé avec g++ parce qu'il laisse passer certaines choses comme les déclarations au milieu du code (il faut utiliser C99 avec gcc non?) ou alors parce qu'on peut faire de jolies classes en plein milieu du C. Ou utiliser des bouts de code attrapés de ci de là en C au milieu d'un code C++. Tout cela est possible, ça marche. Est-ce que c'est bien pour la qualité du programme et sa maintenance?
 


---------------
deluser --remove-home ptitchep
n°2006409
h3bus
Troll Inside
Posté le 01-07-2010 à 17:32:41  profilanswer
 

ptitchep a écrit :


Tout cela est possible, ça marche.


 
Oui dans une certaine limite...
 

ptitchep a écrit :


Est-ce que c'est bien pour la qualité du programme et sa maintenance?


 
Clairement non!!


---------------
sheep++
n°2006412
xilebo
noone
Posté le 01-07-2010 à 17:39:37  profilanswer
 

ptitchep a écrit :


Nous sommes donc d'accord, le C est compilé par un compilateur C.
 
Ok pour les appels systèmes de fichiers, je m'ai trompé. [Mode j'ai toujours raison]N'empêche qu'il existe des méthodes pratiques en vrai C++ (basés sur les mêmes appels systèmes codés en C  ;) )plutôt que de réinventer la roue.[/Mode j'ai toujours raison]
 
Pas ok pour stdio.h et printf. Pour moi ça trahit que tout le reste est pensé en C et compilé avec g++ parce qu'il laisse passer certaines choses comme les déclarations au milieu du code (il faut utiliser C99 avec gcc non?) ou alors parce qu'on peut faire de jolies classes en plein milieu du C. Ou utiliser des bouts de code attrapés de ci de là en C au milieu d'un code C++. Tout cela est possible, ça marche. Est-ce que c'est bien pour la qualité du programme et sa maintenance?
 


 
Je suis d'accord avec toi aussi.  Cependant, ca ne sert à rien de sigmatiser systématiquement tout appel C dans un code C++, rien n'empêche d'écrire ses propres wrappers plutot que d'utiliser les existants (réinventer la roue c'est mal, mais des fois pas le choix).  
 
Par exemple, pour ma part, lorsque j'ai commencé le programme sur lequel je travaille depuis maintenant 7  ans ( 100000 lignes de code, commentaires et autre non-code exclus), boost n'existait pas et il était hors de question d'intégrer STL. Nous (moi au départ) avons donc réécrit nos propres structures de données (dynarray , hashtable, smart pointeur, singleton, etc ..., + des wrappers portables pour les mutex, thread, et autres) un genre de boost (very) light quoi :o, maintenant il serait mieux d'avoir boost pour des raisons de performances et de maintenance, mais il serait trop couteux de tout réécrire, alors on maintient ce qu'on a fait (et ca contient beaucoup de code C pardon, appel système C  et d'assembleur) et finalement, c'est pas si mal, ça permet également d'apprendre plein de choses, et lorsqu'une nouvelle plateforme apparait, il est plus facile pour nous de la réadapter (parfois même pas besoin).
 
Lorsque c'est bien cloisonné, ça ne pose aucun problème.
 
Et accessoirement, pour debugguer rapidement, il m'arrive d'utiliser un (f)printf pour aller plus vite, malgré la superbe classe de log que j'ai écrite :o.

Message cité 1 fois
Message édité par xilebo le 01-07-2010 à 17:40:24
n°2006433
Joel F
Real men use unique_ptr
Posté le 01-07-2010 à 19:37:49  profilanswer
 

paye ta code quality :/

n°2006440
ptitchep
Posté le 01-07-2010 à 20:20:54  profilanswer
 

xilebo a écrit :


 
Je suis d'accord avec toi aussi.  Cependant, ca ne sert à rien de sigmatiser systématiquement tout appel C dans un code C++, rien n'empêche d'écrire ses propres wrappers plutot que d'utiliser les existants (réinventer la roue c'est mal, mais des fois pas le choix).  
 
Par exemple, pour ma part, lorsque j'ai commencé le programme sur lequel je travaille depuis maintenant 7  ans ( 100000 lignes de code, commentaires et autre non-code exclus), boost n'existait pas et il était hors de question d'intégrer STL. Nous (moi au départ) avons donc réécrit nos propres structures de données (dynarray , hashtable, smart pointeur, singleton, etc ..., + des wrappers portables pour les mutex, thread, et autres) un genre de boost (very) light quoi :o, maintenant il serait mieux d'avoir boost pour des raisons de performances et de maintenance, mais il serait trop couteux de tout réécrire, alors on maintient ce qu'on a fait (et ca contient beaucoup de code C pardon, appel système C  et d'assembleur) et finalement, c'est pas si mal, ça permet également d'apprendre plein de choses, et lorsqu'une nouvelle plateforme apparait, il est plus facile pour nous de la réadapter (parfois même pas besoin).
 
Lorsque c'est bien cloisonné, ça ne pose aucun problème.
 
Et accessoirement, pour debugguer rapidement, il m'arrive d'utiliser un (f)printf pour aller plus vite, malgré la superbe classe de log que j'ai écrite :o.


On est en 2010 maintenant :o  
Blague à part pour moi c'est quand même  une mauvaise habitude. Si on veut réinventer la roue dans un but pédagogique (ce que je pense indispensable) en faisant du C, ben on fait du C. Faire du C++ et puis "Tiens je vais faire moi même un parcours de répertoire pour voir comment ça marche" ça ne sert qu'à ne pas apprendre la bonne manière, selon moi.


---------------
deluser --remove-home ptitchep

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Lister les fichiers d'un répertoire : problème de portabilité?

 

Sujets relatifs
JTable , probleme affichageProblème pour modifier la valeur d'une ligne dans un fichier
Problème script avec joomlaBesoin d'information sur les fichiers partagés sur Excel
Problème CSS : Espace non désiré d'origine inconnue sous les imagesquel logiciel pour faire du SQL sur des GROS fichiers bruts (csv)?
[VB/Excel]Comparer liste excel avec liste de fichiers[Resolu] Probleme image en bordure de bloc !
problème au niveau de struts-config.xml 
Plus de sujets relatifs à : Lister les fichiers d'un répertoire : problème de portabilité?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR