IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Création IHM en C


Sujet :

C

  1. #41
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Perot Voir le message
    EDIT : pour l'instant je vais faire avec les "if", car avec le switch cela me créé trop de problème
    Un switch permet de faire des branchements selon la valeur d'une expression. Si (comme c'est le cas) tu gères plusieurs expressions (hEditI et hEditJ) alors le switch ne peut pas convenir.

    Citation Envoyé par Perot Voir le message
    J'ai regardé sur internet, j'ai trouvé "fopen" pour ouvrir un fichier et "fputs" pour ne sélectionner que certains caractères.
    Mouais. C'est sûr que si tu apprends le C par petits bouts... fputs() (File Put String) permet de claquer une string dans un flux. Le flux (de type FILE*) pouvant être un fichier effectivement ouvert par fopen() ou bien directement l'écran (stdout/stderr). Rien à voir avec une quelconque "sélection de certains caractères"...

    Citation Envoyé par Perot Voir le message
    Je continue mes recherches.
    T'as pensé à rechercher un tuto?
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #42
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Oui, mais il est difficile de trouver des tutos qui utilisent l'API Windows et uniquement le C.

    L'article API en Windows en C, lui, m'a énormément aidé. (sur votre site)

    Pour revenir à mon code, il y a quelque chose que je ne comprends pas. Je vous le remets ci-dessous car j'ai effectué quelques modifications :


    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
     
     
     
     
    			if (hEditJ !=0 && hEditI !=0)
     
    	{
     
     
                            strcat(bufferCheminSousDossier,"\\*");
    			hFind2 = FindFirstFile(bufferCheminSousDossier, &ffd);
     
     
    			if (INVALID_HANDLE_VALUE == hFind2)
     
    {
     
    				                           DisplayErrorBox(TEXT("FindFirstFile"));
    			                                   return dwError;
     
    }
     
     
    						do {
     
     
    									  if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
     
    							{
     
    									Trouve =1;
    									 MessageBox(NULL, ffd.cFileName , "test", MB_ICONWARNING | MB_OK);
     
     
    							}
     
    								else 
     
    									{
    											filesize.LowPart = ffd.nFileSizeLow;
    											filesize.HighPart = ffd.nFileSizeHigh;
    											MessageBox(NULL, ffd.cFileName , "test", MB_ICONWARNING | MB_OK);
    											SendMessage(hEditK, WM_SETTEXT, 0, (long)filesize.QuadPart);
    				                                        }
     
     
    			                                 } while (FindNextFile(hFind2, &ffd) !=0);
     
     
    									if (Trouve == 0)
     
    {
     
    				                                                      MessageBox(NULL, "Il n'existe aucun fichier qui correspond à la demande", "Erreur", MB_ICONWARNING | MB_OK);
     
    }
     
     
    		                                                      dwError = GetLastError();
     
     
     
    			                                              if (dwError != ERROR_NO_MORE_FILES)
    {
     
     
    							                   DisplayErrorBox(TEXT("FindFirstFile"));
    							                   msgboxID = MessageBox(NULL, "Erreur", "Erreur", MB_ICONWARNING | MB_OK);
     
    											}
     
    							 FindClose(hFind);
    							 return dwError;
     
    			}



    Lorsque je lance le code, cela m’affiche bien les sous-dossiers et fichiers compris dans le sous-dossier courant. Cependant, j'aimerais que cette procédure soit récursive ... afin d'avoir accès à vraiment tous les fichiers.

    Dans le "else", j'ai un mis un SendMessage pour voir à quoi correspondait "filesize.QuadPart" ...

    En fait, j'ai du mal à comprendre à quoi sert ce "else" ...

  3. #43
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    Citation Envoyé par Perot Voir le message
    Cependant, j'aimerais que cette procédure soit récursive
    comme dit précédemment : il faut que tu crées une méthode séparée qui fasse le boulot

    Citation Envoyé par Perot Voir le message
    En fait, j'ai du mal à comprendre à quoi sert ce "else" ...
    FindFirstFile boucle sur tout ce qu'il trouve (dossier, fichier, ...)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
         // on est sur un dossier   (sous-dossier ou '.' ou '..')
    }
    else
    {
         // on n'est pas sur un dossier donc sûrement un fichier
    }
    voici les valeurs que dwFileAttributes peut prendre : https://docs.microsoft.com/en-us/win...bute-constants

    ici, on fait un '&' au lieu d'un '==' car dwFileAttributes peut prendre plusieurs des valeurs ci-dessus en même temps, donc le & permet de déterminer la valeur du bit correspondant

  4. #44
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Perot Voir le message
    Oui, mais il est difficile de trouver des tutos qui utilisent l'API Windows et uniquement le C.
    Ben oui. Les tutos qui traitent de l'API Windows présupposent une connaissance du C, connaissance que visiblement tu n'as pas (fputs(), fonction de base, syntaxe du switch, que tu ne connais pas). Donc tu échoues à comprendre des instructions telle que (var & filtre) == valeur, instructions enseignées quand on apprend à manipuler les bits d'une variable. Moi je parlais d'un tuto de C.

    Et puis sans déconner, quand on voit ce code complètement anarchique que tu nous montres, on se demande vraiment comment tu peux arriver à te relire. Ecrire un code C c'est déjà écrire un code proprement indenté. Ca facilite son écriture (on voit à quel bloc on en est) et aussi sa relecture. Regarde le code de Xelland. Toi il y en a dans tous les sens.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #45
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Je fais de mon mieux.

    Honnêtement, vu mon avancement, je suis déjà très content d'en être arrivé là.

    Sans connaissance, avant de poster sur ce forum, j'ai pu effectuer 50% du projet, avec des recherches, tutos, etc.
    En ce moment cela est plus compliqué car c'est la grosse partie analyse, dont je trouve très peu d'exemple sur internet ...

    Effectivement, tu ne vois qu'un morceau de mon code, que j'ai du mal à comprendre, et donc il est difficile de le commenter, ainsi que de l'écrire de façon claire.
    Tout le reste de mon code est commenté, afin d'expliquer chaque procédure utilisée ...
    Alors, je m'excuse pour le code "dans tous les sens", mais grâce à Xelland, qui lui m'aide à avancer, j'ai pu commencer à "hiérarchiser" ce bout de code.


    D'ailleurs, Xelland, je te remercie pour ta réponse, mais après discussion avec mon supérieur, je ne vais pas avoir besoin de cette procédure récursive, ce serait apparemment trop compliqué.
    J'ai donc directement indiqué le chemin avec le bufferCheminSousDossier, pour lister tous les fichiers.

    A présent, je vais essayer de filtrer le code contenu dans les fameuses balises ! Je commence à me rapprocher du but ...
    Je vais rechercher les fonctions disponibles et tenter des choses ...


    PS : je n'oublie pas foetus qui m'a également beaucoup appris / aidé

  6. #46
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ecrire un code C c'est déjà écrire un code proprement indenté.
    pas que le C


    Citation Envoyé par Perot Voir le message
    dont je trouve très peu d'exemple sur internet ...
    ça se trouve, mais il faut chercher

    Citation Envoyé par Perot Voir le message
    Effectivement, tu ne vois qu'un morceau de mon code, que j'ai du mal à comprendre, et donc il est difficile de le commenter, ainsi que de l'écrire de façon claire.
    Tout le reste de mon code est commenté, afin d'expliquer chaque procédure utilisée ...
    Alors, je m'excuse pour le code "dans tous les sens",
    Sve@r te parle de l'indentation !
    ton code est difficilement lisible : tout est décalé

    quel que soit le langage, on ne fait qu'assembler des briques : tu fais 1 fonction par brique
    et ensuite tu appelles les briques dont tu as besoin
    ici, on a l'impression que tu mets tout dans 1 fonction, alors que tu dois avoir plusieurs sous-fonctions afin de faciliter la lecture et les éventuelles corrections ou évolutions à faire.
    en compartimentant ton code, tu augmentes la lisibilité, tu isoles plus rapidement les problèmes (pour les corrections) et tu limites les impacts (pour les évolutions)

  7. #47
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Perot Voir le message
    Citation Envoyé par Xelland Voir le message
    alors que tu dois avoir plusieurs sous-fonctions afin de faciliter la lecture et les éventuelles corrections ou évolutions à faire.
    en compartimentant ton code, tu augmentes la lisibilité, tu isoles plus rapidement les problèmes (pour les corrections) et tu limites les impacts (pour les évolutions)
    En plus de tout ça, plus une fonction est minimaliste et atomique (ne faire qu'une chose), plus tu peux la réutiliser dans différentes situations.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #48
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    J'ai écris cette grossièreté car j'avais tout simplement mal compris ton commentaire.

    J'ai eu plusieurs fois l'expérience de critique, contre un travail sérieux, sur certains forums.
    J'ai donc maintenant la mauvaise habitude d'être susceptible.

    En ce qui concerne l'indentation, elle est réalisée correctement sur mon logiciel de développement.
    Lors du collage du code sur le site, l'indentation n'est plus vraiment adaptée, je ferai donc le nécessaire pour que ce soit plus clair à présent.

    Merci toute fois pour tes conseils ajoutés à ceux de Xelland et toutes mes excuses.

    Je retourne à mon code.

  9. #49
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Perot Voir le message
    D'ailleurs, Xelland, je te remercie pour ta réponse, mais après discussion avec mon supérieur, je ne vais pas avoir besoin de cette procédure récursive, ce serait apparemment trop compliqué.
    C'est pas vraiment compliqué à la base

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    listeRep(dir) {
    	rep=ouvrir(dir)
    	pour chaque fichier de rep, faire {
    		si (fichier != "." && fichier != "..") continue;
    		afficher(dir/fichier)
    		si (fichier de type répertoire) listeRep(dir/fichier)
    	}
    	fermer(rep)
    }

    Tout ça à base de opendir/readdir/closedir et c'est réglé.^
    Voici d'ailleurs un truc rapidement tapé en ce sens
    Code c : 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
    #include <sys/types.h>
    #include <stdio.h>
    #include <dirent.h>
    #include <string.h>
    #include <errno.h>
     
    int tree(const char* const rep) {
    	DIR *fd=opendir(rep);
    	if (fd == NULL) return -1;
     
    	int cpt;
    	struct dirent *d;
    	for (cpt=0; (d=readdir(fd)) != NULL; cpt++) {
    		if (strcmp(d->d_name, ".") == 0 || strcmp(d->d_name, "..") == 0) continue;
    		char nom[FILENAME_MAX + 1];
    		sprintf(nom, "%s/%s", strcmp(rep, "/") != 0 ?rep :"", d->d_name);
    		printf("%s\n", nom);
    		if (d->d_type == DT_DIR) {
    			if (tree(nom) < 0)
    				fprintf(stderr, "Erreur tree [%s] - %s\n", nom, strerror(errno));
    		}
    	}
    	closedir(fd);
    	return cpt;
    }
     
    int main(int argc, char *argv[]) {
    	tree(argv[1]);
    }

    Le souci va poindre si, au lieu d'afficher simplement "dir/fichier" tu veux le sauvegarder dans une liste pour la réutiliser après. Là il faut alors créer la liste, l'agrandir au fur et à mesure que la procédure se déroule etc. Un poil plus compliqué mais toujours faisable.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #50
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Effectivement ton code a l'air plus simple que ce que j'avais essayé ...

    Sinon, je pense que je vais devoir lister ces fichiers, pour la suite du projet qui est de sélectionner certains codes de ces fichiers ...

    Voici mon code : (bien indenté )

    main.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    // Code présent au-dessus 
     
    if (hEditJ !=0 && hEditI !=0)
     
     
    {
     
    FindFilesRecursively(_T(bufferCheminSousDossier), _T("*."));
     
    }
     
    // ..........
    fonction.c :

    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
    HANDLE hFind3 = INVALID_HANDLE_VALUE;
    TCHAR szFullPattern[MAX_PATH];
     
     
     
    void FindFilesRecursively(LPCTSTR lpFolder, LPCTSTR lpFilePattern)
    {
     
        PathCombine(szFullPattern, lpFolder, _T("*"));
        hFind3= FindFirstFile(szFullPattern, &ffd);
     
        if(hFind3 != INVALID_HANDLE_VALUE)
        {
            do
            {
                if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
     
                    PathCombine(szFullPattern, lpFolder, ffd.cFileName);
                    FindFilesRecursively(szFullPattern, lpFilePattern);
     
                }
     
            } while(FindNextFile(hFind3, &ffd));
            FindClose(hFind3);
        }
     
     
     
        PathCombine(szFullPattern, lpFolder, lpFilePattern);
        hFind3 = FindFirstFile(szFullPattern, &ffd);
     
        if(hFind3 != INVALID_HANDLE_VALUE)
        {
            do
            {
                if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
                {
     
                    PathCombine(szFullPattern, lpFolder, ffd.cFileName);
    		MessageBox(NULL, szFullPattern , "Liste", MB_OK);
                }
            } while(FindNextFile(hFind3, &ffd));
            FindClose(hFind3);
        }
    }

    Cela me liste bien les fichiers (avec chemin absolu) de mes fichiers, mais comme précédemment, pas les fichiers contenus dans d'autres sous-dossiers ...
    Pourtant, j'ai écris ce code à l'aide d'un lien permettant de lire les dossiers de manières récursives ...

    Quoi qu'il en soit, cette fonction me permet d'avoir un code main.c beaucoup moins lourd ...

  11. #51
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Perot Voir le message
    Effectivement ton code a l'air plus simple que ce que j'avais essayé ...
    J'ai édité pour rajouter un exemple concret

    Citation Envoyé par Perot Voir le message
    Cela me liste bien les fichiers (avec chemin absolu) de mes fichiers, mais comme précédemment, pas les fichiers contenus dans d'autres sous-dossiers ...
    Pourtant, j'ai écris ce code à l'aide d'un lien permettant de lire les dossiers de manières récursives ...
    Ca vient obligatoirement du bloc
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {										
    	PathCombine(szFullPattern, lpFolder, ffd.cFileName);
    	FindFilesRecursively(szFullPattern, lpFilePattern);
    }
    Soit le test est faux, soit l'opération PathCombine() se passe mal. Rajoute un printf() en début de fonction, déjà tu verras si celle-ci est appelée ou pas.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  12. #52
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    J'ai vu ton code, j'essaierai de faire de même si je n'arrive pas à faire fonctionner le mien ...

    Je n'ai accès qu'à l'interface graphique de mon code (ou alors il existe une possibilité d'avoir une console sur Visual Studio ?...), je n'utilise donc pas les printf, mais plutôt les MessageBox ...

    Je vais essayer de déboguer tout ça.

  13. #53
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 634
    Points : 10 567
    Points
    10 567
    Par défaut
    Citation Envoyé par Perot Voir le message
    Je n'ai accès qu'à l'interface graphique de mon code (ou alors il existe une possibilité d'avoir une console sur Visual Studio ?...), je n'utilise donc pas les printf, mais plutôt les MessageBox ...
    Je t'avais prévenu dans ce post 20 : "Ce n'est pas 1 application en ligne de commande, et afficher des messages c'est possible mais c'est compliqué"

    J'ai 1 souvenir très flou et peut-être imprécis, mais les print des langages C/ C++ ne fonctionnent pas
    Il faut sûrement utiliser 1 fonction comme la fonction OutputDebugString pour afficher des traces dans la sous-fenêtre des messages (apprends ton IDE pour afficher 1 sous-fenêtre)

    Tu as aussi des applications type serveur qui reçoivent des messages. La + basique c'est l'application DebugView (<- documentation officielle en anglais)

  14. #54
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut

    Tout ça à base de opendir/readdir/closedir et c'est réglé.^
    Voici d'ailleurs un truc rapidement tapé en ce sens
    Malheureusement, la bibliothèque dirent.h n'existe pas sur ma version, j'ai regardé sur internet je crois que je n'ai pas le choix d'utiliser les findfirstfile ...


    Citation Envoyé par foetus Voir le message
    Je t'avais prévenu dans ce post 20 : "Ce n'est pas 1 application en ligne de commande, et afficher des messages c'est possible mais c'est compliqué"

    J'ai 1 souvenir très flou et peut-être imprécis, mais les print des langages C/ C++ ne fonctionnent pas
    Il faut sûrement utiliser 1 fonction comme la fonction OutputDebugString pour afficher des traces dans la sous-fenêtre des messages (apprends ton IDE pour afficher 1 sous-fenêtre)

    Tu as aussi des applications type serveur qui reçoivent des messages. La + basique c'est l'application DebugView (<- documentation officielle en anglais)
    Oui, je me souviens bien de ton post, je vais voir pour trouver des solutions au problème ...

    En ce qui concerne le code, j'ai encore beaucoup d'incohérence, je n'ai pas modifié grand chose, je le repost tout de même :

    fonction.c :


    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
    HANDLE hFind3 = INVALID_HANDLE_VALUE;
    TCHAR szFullPattern[MAX_PATH];
     
     
     
    void FindFilesRecursively(LPCTSTR lpFolder, LPCTSTR lpFilePattern)
    {
        //Ici on traite tous les sous-répertoires 
     
        PathCombine(szFullPattern, lpFolder, _T("*"));
        hFind3= FindFirstFile(szFullPattern, &ffd);
     
        if(hFind3 != INVALID_HANDLE_VALUE)
        {
            do
            {
                if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    //On trouve un sous-répertoire et on entre dedans 
     
                    PathCombine(szFullPattern, lpFolder, ffd.cFileName);
                    FindFilesRecursively(szFullPattern, lpFilePattern);
                    MessageBox(NULL, szFullPattern , "Liste dossiers", MB_OK);
                }
     
            } while(FindNextFile(hFind3, &ffd));
            FindClose(hFind3);
        }
     
        //On cherche maintenant les fichiers correspondants
     
        PathCombine(szFullPattern, lpFolder, lpFilePattern);
        hFind3 = FindFirstFile(szFullPattern, &ffd);
     
        if(hFind3 != INVALID_HANDLE_VALUE)
        {
            do
            {
                if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
                {
                    //On trouve un fichier et on fait quelque chose avec 
     
                    PathCombine(szFullPattern, lpFolder, ffd.cFileName);
    		MessageBox(NULL, szFullPattern , "Liste fichiers", MB_OK);
                }
            } while(FindNextFile(hFind3, &ffd));
            FindClose(hFind3);
        }
    }
    main.c :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FindFilesRecursively(_T(bufferCheminSousDossier), _T("*"));
    Pour la liste des dossiers, j'obtiens des chemins notés comme cela : \*\*\* puis le deuxième : \*\*\*\* et ensuite j'ai bien mes fichiers listés ... (toujours pas de procédure récursive)


    EDIT :

    J'ai ajouté dans ce 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
    HANDLE hFind3 = INVALID_HANDLE_VALUE;
    TCHAR szFullPattern[MAX_PATH];
     
     
     
    void FindFilesRecursively(LPCTSTR lpFolder, LPCTSTR lpFilePattern)
    {
        //Ici on traite tous les sous-répertoires 
     
        PathCombine(szFullPattern, lpFolder, _T("*"));
        hFind3= FindFirstFile(szFullPattern, &ffd);
     
        if(hFind3 != INVALID_HANDLE_VALUE)
        {
            do
            {
                if(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
                {
                    //On trouve un sous-répertoire et on entre dedans 
     
                    PathCombine(szFullPattern, lpFolder, ffd.cFileName);
                    FindFilesRecursively(szFullPattern, lpFilePattern);
                    MessageBox(NULL, szFullPattern , "Liste dossiers", MB_OK);
                }
     
            } while(FindNextFile(hFind3, &ffd));
            FindClose(hFind3);
        }
     
        //On cherche maintenant les fichiers correspondants
     
        PathCombine(szFullPattern, lpFolder, lpFilePattern);
        fichier = fopen("donnees.txt", "w+");
        fprintf(fichier, "%s", szFullPattern);
        fclose(fichier);
     
        hFind3 = FindFirstFile(szFullPattern, &ffd);
     
        if(hFind3 != INVALID_HANDLE_VALUE)
        {
            do
            {
                if(!(ffd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
                {
                    //On trouve un fichier et on fait quelque chose avec 
     
                    PathCombine(szFullPattern, lpFolder, ffd.cFileName);
    		MessageBox(NULL, szFullPattern , "Liste fichiers", MB_OK);
                }
            } while(FindNextFile(hFind3, &ffd));
            FindClose(hFind3);
        }
    }
    Un fichier permettant d'observer la valeur de szFullPattern. Le résultat est : CheminSousDossier\*

    J'en conclus donc que la recherche de fichiers ne suit pas la procédure récursive de la recherche de répertoire précédente, il faudrait donc créer une boucle non ?

  15. #55
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Bonjour, j'ai finalement réussi à lister tous mes fichiers dans tous les dossiers !

    Je suis assez content, mais il me reste du boulot ...

    Il faut maintenant que j'arrive à lire chaque fichier, et que je sélectionne uniquement le code compris entre deux balises ... Puis, mettre tout ça dans une certaine arborescence ...

    J'ai essayé de lire les fichiers, mais cela me rapporte une grosse erreur, voici mon code :

    fonction.c :

    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
    81
    82
    83
    84
    85
    86
     
     
     
    void recursively_list_files(char * dir) {
     
    	HANDLE hFind3;
    	WIN32_FIND_DATA fd;
    	char path[MAX_PATH + 1];
    	FILE* fichier = NULL;
    	FILE* fichier2 = NULL;
    	FILE* fichier3 = NULL;
    	int caractereActuel=0;
    	fichier = fopen("donneesfichier.txt", "w+");
     
    	sprintf(path, "%s\\*", dir);
     
    	printf("---- dans le repertoire %s ----\n\n", dir);
     
    	fprintf(fichier, "---- dans le repertoire %s ----\n\n", dir);
     
     	if ((hFind3 = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE) {
    		printf("Erreur FindFirstFIle sur %s\n", path);
    		exit(1);
    	}
     
    	while(1) {
    		if ((strcmp(".", fd.cFileName) !=0) && (strcmp("..", fd.cFileName) != 0)) {
    			if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     
                                      /* c'est un dossier */
     
    				 sprintf(path, "%s\\%s", dir, fd.cFileName);
    				 recursively_list_files(path);
     
     
    			} else {
     
    				/* c'est un fichier */
     
    				printf("fichier : %s\n", fd.cFileName);
    				//MessageBox(NULL, fd.cFileName, "test", MB_ICONWARNING | MB_OK);
     
    				fprintf(fichier, "fichier : %s\n", fd.cFileName);
     
    				//Ouverture du fichier trouvé
     
     
     
    				fichier2 =fopen(fd.cFileName,"r");
    				fichier3 =fopen("contenufichier.txt","w+");
     
    					if (fichier2 != NULL)
     
    					{
    						do 
     
    						{
     
    						caractereActuel = fgetc(fichier2);
    						fprintf(fichier3, "Contenu : %c\n", caractereActuel);
     
    						} while (caractereActuel != EOF);
    					}
    				fclose(fichier3);
                                    fclose(fichier2);
    			}
    		}
     
    		if (!FindNextFile(hFind3, &fd))
                break;
     
    	}
     
     
     
    	if (GetLastError() != ERROR_NO_MORE_FILES) {
    		printf("Erreur FindNextFile - dans %s\n", path);
    		exit(1);
    	}
    	if (FindClose(hFind3) == FALSE) {
    		printf("Erreur FindClose\n");
    		exit(1);
    	}
     
    	fclose(fichier);
    }

  16. #56
    Membre éclairé
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Septembre 2015
    Messages
    204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Septembre 2015
    Messages : 204
    Points : 839
    Points
    839
    Par défaut
    sans tester, je vois 3 fopen et 1 fclose
    donc déjà un problème

    tout ce que tu ouvres doit être fermé/libéré (que ce soit un fichier, une allocation mémoire, ..)


    quand tu dis que tu as une grosse erreur : tu peux expliciter ? (pour éviter de tester pour rien ou de trouver le bon cas de test)

  17. #57
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Oui désolé pour fclose j'ai oublié de les ajouter mais étaient bien présent pour mon logiciel ... Je viens de les ajouter à mon post précédent

    Au niveau de l'erreur, cela m'affiche :

    Debug Assertion Failed !

    Programm : ...ments\Visual Studio 2010\Projects\Projet-c\Debug\Projet-c.exe
    File: f:\dd\vctools\crt_bld\self_x86\crt\src\fclose.c

  18. #58
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 374
    Points : 41 541
    Points
    41 541
    Par défaut
    Ton code ne semble pas tester que l'ouverture du fichier a réussi.
    Si fopen() échoue il retourne NULL, et fclose(NULL) plante.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  19. #59
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2021
    Messages
    43
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 24
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2021
    Messages : 43
    Points : 5
    Points
    5
    Par défaut
    Effectivement, c'est mieux comme cela :

    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
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
     
     
    //fonction permettant de lister tous les fichiers dans leurs répertoires
     
    void recursively_list_files(FILE* fichier, char * dir) {
     
     HANDLE hFind3;
     WIN32_FIND_DATA fd;
     char path[MAX_PATH + 1];
     FILE* fichier2 = NULL;
     FILE* fichier3 = NULL;
     int caractereActuel=0;
     
     
     sprintf(path, "%s\\*", dir);
     
     fprintf(fichier, "---- dans le repertoire %s ----\n\n", dir);
     
      if ((hFind3 = FindFirstFile(path, &fd)) == INVALID_HANDLE_VALUE) {
     
      fprintf(fichier, "Erreur FindFirstFIle sur %s\n", path);
      exit(1);
     }
     
     while(1) {
     
      if ((strcmp(".", fd.cFileName) !=0) && (strcmp("..", fd.cFileName) != 0)) {
     
       if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
     
                    /* c'est un dossier */
     
        sprintf(path, "%s\\%s", dir, fd.cFileName);
     
        recursively_list_files(fichier, path);
     
     
       } else {
     
        /* c'est un fichier */
     
        fprintf(fichier, "fichier : %s\n", fd.cFileName);
     
     
        //Ouverture du fichier trouvé
     
     
        fichier2 =fopen(fd.cFileName,"r");
        fichier3 =fopen("contenufichier.txt","w+");
     
     
           if (fichier2 == NULL)
     
           {
     
                                   MessageBox(hwnd, "Le fichier n'a pas pu être ouvert", "Erreur", MB_OK);
     
           }
     
           else 
           {
     
                     do 
     
                       {
                                    caractereActuel = fgetc(fichier2); //On lit le caractère
     
     
                                     if (fichier3 == NULL)
     
                                     {
     
                                         MessageBox(hwnd, "Le fichier n'a pas pu être ouvert en écriture", "Erreur", MB_OK);
     
                                      }
     
                                       else 
                                       {
                                           fprintf(fichier3, "Contenu : %c\n", caractereActuel); //on l'affiche
                                       }
     
            } while (caractereActuel != EOF);
     
                                }
     
          }
      }
      if (!FindNextFile(hFind3, &fd))
                break;
     
     }
     
     
     
     if (GetLastError() != ERROR_NO_MORE_FILES) {
     
      printf("Erreur FindNextFile - dans %s\n", path);
      fprintf(fichier, "Erreur FindNextFile - dans %s\n", path);
      exit(1);
     }
     if (FindClose(hFind3) == FALSE) {
     
      fprintf(fichier, "Erreur FindClose\n");
      exit(1);
     }
     
          fclose(fichier3);
        fclose(fichier2);
     
    }
    Cela m'affiche le message d'erreur du MessageBox : Le fichier n'a pas pu être ouvert. Le fichier3 est quant à lui bien créé.

    Pour le fichier2, sachant que dans cFileName il n'y uniquement le nom.extension du fichier, c'est peut-être pour cela qu'il ne le trouve pas ? Mais normalement il devrait alors créé tout de même le fichier non ?

    EDIT :


    J'ai donc essayé d'ajouter ceci avant l'ouverture des deux fichiers :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    sprintf(bufferCheminFichier, dir);
    strcat(bufferCheminFichier, "\\");
    strcat(bufferCheminFichier, fd.cFileName);
    Cela a changé quelque chose, j'ai du contenu qui s'affiche dans le fichier contenufichier.txt, des lettres une par une ... Par contre, j'ai encore le message " Le fichier n'a pas pu être ouvert" qui s'affiche, c'est parce que la boucle n'a pas le temps de se faire non ?

  20. #60
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Perot Voir le message
    Effectivement, c'est mieux comme cela :
    Hum... on ne doit pas quitter une fonction (surtout une fonction récursive) par exit(). C'est une fonction dévolue à l'arrêt d'un procesus fils. On la tolère juste dans le main(). Si une fonction ne peut pas faire son job, alors elle renvoie le souci à son appelant qui prendra une décision. Et si ça lui pose trop de difficulté alors lui aussi renverra à son appelant etc etc jusqu'au main().

    Citation Envoyé par Perot Voir le message
    Mais normalement il devrait alors créé tout de même le fichier non ?
    Non. Le mode "r" (lecture) implique que le fichier existe et s'il n'existe pas, alors tant pis mais en tout cas il n'est pas créé. Exactement comme dans la vie si tu veux lire un livre, tu pars du principe que le livre existe et sinon tant pis mais en tout cas tu ne crées pas un livre vide.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Modélisation 1ère étape de la création d'IHM Leonardi
    Par Lucas Panny dans le forum W4 Express
    Réponses: 2
    Dernier message: 26/07/2007, 09h29
  2. [OpenOffice][Texte] Création d'une TOC sans IHM
    Par lekekoo dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 25/05/2007, 16h09
  3. création d'IHM java en XML
    Par sglon dans le forum Format d'échange (XML, JSON...)
    Réponses: 6
    Dernier message: 10/04/2007, 05h43
  4. IHM : création Dataset typé
    Par cDotNet dans le forum Windows Forms
    Réponses: 9
    Dernier message: 29/01/2007, 17h29
  5. Conseils/docs sur la création d'ihm
    Par hellbilly dans le forum Windows
    Réponses: 3
    Dernier message: 19/09/2005, 21h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo