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 :

Problème et AVC : _wfopen_s


Sujet :

C++

  1. #861
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 205
    Points : 12 374
    Points
    12 374
    Par défaut
    Remarques sur la version "Août 26 (29/08/2024)":
    Vous n'avez toujours pas compris à quoi servent les fichiers d'en-tête (.h).
    Ce n'est pas un dépotoir où on ajoute tout un bordel pour que le .cpp compile.
    C'est un endroit où on déclare ce qui sera implémenté/défini dans le .cpp.

    Cas pratique :
    Vous avez transféré de film.cpp à film.h tout un bordel de déclaration qui n'ont rien à voir avec film.cpp.
    Par exemple la déclaration de la fonction "test_date_tiret_sp_etc(wchar_t d)".
    Cette fonction n'est pas définie dans film.cpp mais dans utils.cpp.
    Cette déclaration ne doit pas être "transféré" dans film.h mais dans utils.h.
    Et vous devez ajouter un '#include "utils.h"' dans film.cpp pour que le code dans ce fichier ( film.cpp) puisse utiliser les fonctions qui ont été déclarées dans utils.h et implémenté dans utils.cpp.
    Appliquez le même résonnement pour chaque fonction du merdier que vous baladez de fichier .cpp en fichier .h qui ne correspondent pas à :
    "Je déclare les fonctions dans un fichier XXX.h QUE les fonctions qui sont implémentées dans XXX.cpp"
    (il y a des exceptions au mantra précédent, mais vous n'êtes clairement pas dans ces cas d'exception)

    Remarques :
    - Un fichier XXX.cpp qui n'inclus pas le fichier XXX.h, c'est très suspect.
    - Un fichierXXX.h n'inclus que les fichiers nécéssaires à la compréhension, par le compilateur, des déclarations du fichier XXX.h, et pas les fichiers nécessaira à la compilation du fichier XXX.cpp.
    => Il doit avoir beaucoup moins de #include dans les fichiers d'en-tête (.h) que dans les fichiers .cpp.

    Mais :
    Donc : abc.[2008] ou abc.[2008-] ou abc.[2008-2010]
    Exemple :
    Titre : Andor [2022-] (sur Disney : 12+) 45min 4,2/5
    et pas :
    Titre : Andor [2022] (sur Disney : 12+) 45min 4,2/5
    Ok !
    Le "!", c'est que vous avez compris pourquoi votre code ne fonctionne pas et que mes propositions fonctionnent, ou est-ce que vous êtes toujours dans le brouillard ?

    Je reposte le code de m'a réponse du "28/08/2024, 23h05" :
    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
    std::wstring Serie::format_Annees() const
    {
        if (m_f_anneesProduction.first && m_f_anneesProduction.second)
        {
            return m_keyColor[0] + L" [" + m_valuesColor + std::to_wstring(m_f_anneesProduction.first.value()) + m_keyColor[1] + L'-' + m_valuesColor + std::to_wstring(m_f_anneesProduction.second.value()) + m_keyColor[0] + L']' + m_valuesColor;
        }
        else if (m_f_anneesProduction.first)
        {
            return m_keyColor[0] + L" [" + m_valuesColor + std::to_wstring(m_f_anneesProduction.first.value()) + m_keyColor[1] + L'-' + m_keyColor[0] + L']' + m_valuesColor;
        }
        else
        {
            std::pair<int, int> anneesDiffusion = calculer_Annees_Diffusion();
            return m_keyColor[0] + L" [" + m_valuesColor + std::to_wstring(anneesDiffusion.first) + m_keyColor[1] + L'-' + m_valuesColor + std::to_wstring(anneesDiffusion.second) + m_keyColor[0] + L']' + m_valuesColor;
        }
    }
    (J'ai déjà expliqué l'algorithme implémenté dans cette fonction dans ma précédente réponse)

    et :
    Star Wars : Episode VII - Le réveil de la force
    et pas :
    Star Wars - Episode VII - Le réveil de la force
    Voilà !!!}
    Pouvez-vous être plus précis, SVP ?
    Dans le dépôt GuiHub, il n'y a que "Star Wars - Episode VII - Le réveil de la force" en noms de fichier.

    Il y a "Star Wars: Episode VII - The Force Awakens" dans le fichier ".\Star Wars - Episode VII - Le réveil de la force.(2015-12-16)\Titre original.txt" et la fonction "initialiser_Titre_Original" fait très "bien le boulot" de découpage.

    Donc, c'est quoi le problème ???


    Remarques sur la version "Août 27 (30/08/2024)":
    Toujours les mêmes bêtises sur l'utilité des fichiers d'en-têtes.

    Mais : (fim.cpp)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if (nomFichier == L"Making-of.txt")
            {
                <s>////</s>initialiser_Making_of(cheminFichier);
            }
    Marches pas !!!
    Je ne vois pas où est la difficulté ?
    Pouvez-vous être plus précis, SVP ?

    Votre 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
    void Film::initialiser_Making_of(std::filesystem::path const& cheminFichier)
    {
        auto nomFichier = cheminFichier.wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        std::vector<std::wstring> contenu = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
        assert((contenu.size() != 0));
        if (contenu.size() > 0)
        {
            m_making_of_duree = initialiser_Duree(contenu[0]);
            contenu.erase(contenu.begin());
            if (contenu.size() > 0)
            {
                m_making_of_resume = contenu;
                m_making_of = true;
            }
        }
    }
    Le compilateur gueule parce qu'il ne connait pas la fonction "initialiser_Duree".
    Et c'est normal, car on a correctement renommé et refactoré cette fonction pour qu'elle soit plus générique en "extraire_Duree_DepuisUneLigneDUnFichier".

    Résultat :
    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
    void Film::initialiser_Making_of(std::filesystem::path const& cheminFichier)
    {
        auto nomFichier = cheminFichier.wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        std::vector<std::wstring> contenu = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
        assert((contenu.size() != 0));
        if (contenu.size() > 0)
        {
            m_making_of_duree = extraire_Duree_DepuisUneLigneDUnFichier(contenu[0]).value();
            contenu.erase(contenu.begin());
            if (contenu.size() > 0)
            {
                m_making_of_resume = contenu;
                m_making_of = true;
            }
        }
    }
    Et la signature de la fonction "extraire_Duree_DepuisUneLigneDUnFichier" vous incite à utiliser un "std::optional<long>" plutôt qu'un simple long.
    Ce qui serait un bien meilleur type pour le "champ m_making_of_duree".
    Une "bonne" conception : Rendre facile les bonnes utilisations et difficiles les mauvaises utilisations. (ici, être obligé d'utiliser la fonction "value")

  2. #862
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Août 27 (30/08/2024)
    Je suis crevé !

    Remarques :
    - Un fichier XXX.cpp qui n'inclus pas le fichier XXX.h, c'est très suspect.
    - Un fichierXXX.h n'inclus que les fichiers nécéssaires à la compréhension, par le compilateur, des déclarations du fichier XXX.h, et pas les fichiers nécessaira à la compilation du fichier XXX.cpp.
    => Il doit avoir beaucoup moins de #include dans les fichiers d'en-tête (.h) que dans les fichiers .cpp.
    Ok ou pas !

    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
    void Film::initialiser_Making_of(std::filesystem::path const& cheminFichier)
    {
        auto nomFichier = cheminFichier.wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        std::vector<std::wstring> contenu = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
        assert((contenu.size() != 0));
        if (contenu.size() > 0)
        {
            m_making_of_duree = extraire_Duree_DepuisUneLigneDUnFichier(contenu[0]).value();
            contenu.erase(contenu.begin());
            if (contenu.size() > 0)
            {
                m_making_of_resume = contenu;
                m_making_of = true;
            }
        }
    }
    Ok !

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Film::initialiser_Fichier(fs::path const& cheminFichier)
    {
    ...
            // xxxx-yy-zz
            //if (nomFichier != L"")
            if (std::regex_match(nomFichier, std::wregex{ L"([[:digit:]])(.+)" }))
            {
                std::wcout << L"{[" << cheminFichier << L"]}" << std::endl;
            }
    ...
    Fatigué !

    Merci

  3. #863
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Film::initialiser_Fichier(fs::path const& cheminFichier)
    {
    ...
            // xxxx-yy-zz
            //if (nomFichier != L"")
            if (std::regex_match(nomFichier, std::wregex{ L"([[:digit:]])(.+)" }))
            {
                std::wcout << L"{[" << cheminFichier << L"]}" << std::endl;
            }
    ...
    Ben non !

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Film::initialiser_Titre(fs::path const& cheminFichier)
    {
        auto res = extraire_Informations_DepuisLeContenuDUnFichier(cheminFichier);
    
        m_titres = fusionner_Titres(m_titres, std::get<0>(res));
        m_duree = std::get<1>(res) ? std::get<1>(res).value() : -1;
        m_resume = std::get<2>(res);
    }
    Pourquoi ? Exemple : Prey.(2022-08-05 Disney+)

    Et :
    Exemple : void Film::initialiser_De(fs::path const& cheminFichier);
    film.cpp ===> flim.h
    ou
    flim.h ===> film.h

    Merci

  4. #864
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Star Wars- The Clone Wars.(2008-08-27).Animation : ok !
    Avatar 2 - la voie de l'eau.(2022-12-14) ; ok !
    Sous la Seine.(2024-06-05 Netflix) : marches pas !
    Star Wars - Episode VII - Le réveil de la force.(2015-12-16) : ok !
    Prey.(2022-08-05 Disney+) : marches pas !

    Kaleidoscope.[2023 Netflix] : ok !
    Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga : ok !
    Azertyuiop £££.[2024].Mini-série : ok !
    Star Wars- The Clone wars.[2008-2020].Animation : Mince ! Erreur !
    Seven Deadly Sins- Four Knights of the Apocalypse.[2023].Manga : Ok !
    Dr. STONE.[2019-2022 Crunchyroll].Manga : Ok !
    Andor.[2022- Disney+] : Ok !
    Star Wars Rebels.[2014-2017 Disney+].Animation : Ok !

    Nom : Capture d’écran 2024-08-31 123035.png
Affichages : 151
Taille : 17,8 Ko

    Voilà !

    Merci

  5. #865
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 205
    Points : 12 374
    Points
    12 374
    Par défaut
    Remarques :
    - Un fichier XXX.cpp qui n'inclus pas le fichier XXX.h, c'est très suspect.
    - Un fichierXXX.h n'inclus que les fichiers nécéssaires à la compréhension, par le compilateur, des déclarations du fichier XXX.h, et pas les fichiers nécessaira à la compilation du fichier XXX.cpp.
    => Il doit avoir beaucoup moins de #include dans les fichiers d'en-tête (.h) que dans les fichiers .cpp.
    Ok ou pas !
    Plutôt OK.
    Il y a des fonctions comme "filter_values" qui n'apparaissent pas dans "film_serie.h".
    Mais cela peut être "légitime" si vous "modularisez" votre application, ce qui peut entraîner de ne pas déclarer via les .h publics les fonctions internes d'un module.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Film::initialiser_Fichier(fs::path const& cheminFichier)
    {
    ...
            // xxxx-yy-zz
            //if (nomFichier != L"")
            if (std::regex_match(nomFichier, std::wregex{ L"([[:digit:]])(.+)" }))
            {
                std::wcout << L"{[" << cheminFichier << L"]}" << std::endl;
            }
    ...
    C'est votre code, c'est vous qui devez savoir à quoi cela sert.
    L'expression régulière ne correspond pas au commentaire "xxxx-yy-zz".
    Avec l'expression régulière actuelle, il suffit que le fichier commence par un chiffre et il sera "capté".
    Dans la version "Août 27 (30/08/2024)" du dépôt GitHub, qui scanne le répertoire "Avatar 2 - la voie de l'eau.(2022-12-14)", ce "if" capte le fichier ".\Avatar 2 - la voie de l'eau.(2022-12-14)\2023-06-25 DVD.txt" et le fichier ".\Avatar 2 - la voie de l'eau.(2022-12-14)\2023-06-30 DVD.txt". Des sorties DVD à 5 jours d'intervalle ???
    Utilisez une expression régulière plus spécifique, comme "(\d){4}\-(\d){2}\-(\d){2}s*(.+)" (à "escaper") pour ne pas récupérer tout et n'importe quoi et facilement isoler la date (au format grégorien ISO).
    Bien sûr, l'utilisation de "std::wcout" hors de tout cadre de formatage des sorties (les fonctions PrintXXX), c'est une grosse connerie.
    Dois-je vous rappeler l'utilité du débugueur ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Film::initialiser_Fichier(fs::path const& cheminFichier)
    {
    ...
            // xxxx-yy-zz
            //if (nomFichier != L"")
            if (std::regex_match(nomFichier, std::wregex{ L"([[:digit:]])(.+)" }))
            {
                std::wcout << L"{[" << cheminFichier << L"]}" << std::endl;
            }
    ...
    Ben non !
    "Ben non !" Quoi ???
    Ca fait ce qui est demandé, et comme expliqué au paragraphe précédent de ce message.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Film::initialiser_Titre(fs::path const& cheminFichier)
    {
        auto res = extraire_Informations_DepuisLeContenuDUnFichier(cheminFichier);
     
        m_titres = fusionner_Titres(m_titres, std::get<0>(res));
        m_duree = std::get<1>(res) ? std::get<1>(res).value() : -1;
        m_resume = std::get<2>(res);
    }
    Pourquoi ? Exemple : Prey.(2022-08-05 Disney+)
    Pourquoi quoi ???
    C'est juste du code qui fait ce qu'il indique.
    La fonction "extraire_Informations_DepuisLeContenuDUnFichier" extrait toutes les informations contenu dans le fichier dont le chemin est contenu dans le paramètre "cheminFichier" et les renvoie sous la forme d'un "std::tuple<std::vector<std::wstring>, std::optional<long>, std::vector<std::wstring>>" : un tuple avec 3 éléments.
    Le premier élément est un std::vector<std::wstring> qui contient les titres.
    Le second élément est un std::optional<long> qui contient la durée en secondes.
    Le troisième élément est un std::vector<std::wstring> qui contient le résumé.
    "std::get<0>" permet de récupérer le premier élément.
    "std::get<1>" permet de récupérer le second élément.
    "std::get<2>" permet de récupérer le troisième élément.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_duree = std::get<1>(res) ? std::get<1>(res).value() : -1;
    Si la durée retournée par la fonction "extraire_Informations_DepuisLeContenuDUnFichier" n'a pas été initialisée avec une valeur venue du fichier "std::get<1>(res)" vaut FAUX.
    Donc si la fonction "extraire_Informations_DepuisLeContenuDUnFichier" n'a pas trouvée de durée, la variable "m_duree" contiendra "-1" sinon, elle contiendra la valeur trouvée dans le fichier.

    Exemple : Prey.(2022-08-05 Disney+) :
    Nom : developpez10.png
Affichages : 87
Taille : 213,5 Ko
    Rond rouge : Les titres
    Rond vert : La durée
    Rond jaune : Les lignes du résumé

    Et :
    Exemple : void Film::initialiser_De(fs::path const& cheminFichier);
    film.cpp ===> flim.h
    ou
    flim.h ===> film.h
    C'est quoi la question ???
    "Film::initialiser_De" est déclaré dans flim.h (à la ligne 48).
    "Film::initialiser_De" est défini dans film.cpp (à la ligne 358).
    Donc tout est OK pour cette fonction. Pourquoi vouloir y toucher ???

    Sous la Seine.(2024-06-05 Netflix) : marches pas !
    Le débugueur indique que c'est cette ligne dans la fonction "Film:: Print_Header" qui déconne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wcsftime(date_string, 15, L"%d/%m/%Y", &m_date);
    Il indique aussi que "m_date" ne contient que des "0", ce qui n'est pas une date valide.
    Vous devriez vérifier la validité du contenu de lu champ "m_date" avant d'appeler une fonction comme "wcsftime".

    Pourquoi ce problème ?
    Parce que vous ne faites pas les choses dans l'ordre.
    Dans la fonction/constructeur "Film::Film" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wregex filename_pattern{ L"(.+?)(?:\\.\\((?:(\\d{4})\\-(\\d{2})\\-(\\d{2})\\)))?(?:\\.(.+))?$" };
    On ne voit aucune trace d'une capture de données après la date de sortie mais avant la parenthèse fermante ")".
    Contrairement à ce qu'il y a dans la fonction "int wmain" (ligne 146 d'"Exemple.cpp"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wregex nomDossier_pattern{ L"(.+?)(?:\\.\\((\\d{4}\\-\\d{2}\\-\\d{2}\\s?)?([^\\)]*)\\))?(?:\\.(.+))?$" };
    Si vous aviez fait en sorte que ces 2 lignes de code utilisent la même constante, comme je l'ai déjà indiqué, vous n'auriez pas eu ce problème.
    Vous n'avez pas correctement copié le code de ma réponse du "28/08/2024, 23h05", où j'avais ajouté la "capture" pour pouvoir utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_sur = (match[5].matched) ? match[5].str() : L"";
    Quand vous ne comprenez pas une réponse, indiquez-le clairement et où ça coince, SVP.

    L'expression régulière dans "int wmain" n'est pas assez détaillée pour faire un travail précis, celle dans mon exemple l'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wregex filename_pattern{ L"(.+?)(?:\\.\\((?:(\\d{4})\\-(\\d{2})\\-(\\d{2})\\s*([^\\)]*))\\))?(?:\\.(.+))?$" };
    Donc utilisez cette expression régulière aussi bien dans "int wmain" que dans "Film::Film".

    Prey.(2022-08-05 Disney+) : marches pas !
    Même chose que pour "Sous la Seine.(2024-06-05 Netflix)"

    Star Wars- The Clone wars.[2008-2020].Animation : Mince ! Erreur !
    Le répertoire "Star Wars- The Clone wars.[2008-2020].Animation" n'est pas dans les fichiers du dépôt GitHub et le programme fonctionne très bien avec "Star Wars- The Clone wars.[2008-2020 Disney+].Animation"

  6. #866
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Septembre 01 (01/09/2024) : ok !

    Après film.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    void Film::initialiser_Fichier(fs::path const& cheminFichier)
    {
    ...
        else if (std::regex_match(nomFichier, std::wregex{ L"([[:digit:]]{4})\\-.+" }))
        {
            InfosVisionnage_film info_vis{ cheminFichier };
            return;
        }
    ...
    Que faire ?

    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
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    ...
    InfosVisionnage_film::InfosVisionnage_film(fs::path const& m_cheminFichier)
    {
        //const std::wstring numero_saison_format = L"([[:digit:]]{1,2})"; // saison
        //const std::wstring sep_numero_saison = L"x"; // x
        //const std::wstring numero_episode_format = L"([[:digit:]]{1,3})"; // episode
        //const std::wstring sep_episode_saison = L"\\."; //.
     
        const std::wstring date_year_month_day_format = L"([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})";
        const std::wstring date_month_day_format = L"([[:digit:]]{2})-([[:digit:]]{2})";
        const std::wstring date_day_format = L"([[:digit:]]{2})";
        const std::wstring stream_format = L"(\\s(.+))?";
        const std::wstring dates_format = L"((" + date_year_month_day_format + L"|" + date_month_day_format + L"|" + date_day_format + L")(_?))";
     
        const int dates_full_match_index = 0;
        const int dates_date_year_month_day_year_index = dates_full_match_index + 3;
        const int dates_date_year_month_day_month_index = dates_date_year_month_day_year_index + 1;
        const int dates_date_year_month_day_day_index = dates_date_year_month_day_month_index + 1;
        const int dates_date_month_day_month_index = dates_date_year_month_day_day_index + 1;
        const int dates_date_month_day_day_index = dates_date_month_day_month_index + 1;
        const int dates_date_day_day_index = dates_date_month_day_day_index + 1;
        //const int dates_fucking_someFlag_index = dates_date_day_day_index + 2;
        const int dates_someFlag_index = dates_date_day_day_index + 2;
     
        const int dates_full_match_index_f = 0;
        const int dates_date_year_month_day_year_index_f = dates_full_match_index + 3;
        const int dates_date_year_month_day_month_index_f = dates_date_year_month_day_year_index + 1;
        const int dates_date_year_month_day_day_index_f = dates_date_year_month_day_month_index + 1;
        const int dates_date_month_day_month_index_f = dates_date_year_month_day_day_index + 1;
        const int dates_date_month_day_day_index_f = dates_date_month_day_month_index + 1;
        const int dates_date_day_day_index_f = dates_date_month_day_day_index + 1;
        //const int dates_fucking_someFlag_index = dates_date_day_day_index + 2;
        const int dates_someFlag_index_f = dates_date_day_day_index + 2;
     
        //const std::wregex filename_format_rg{ numero_saison_format + sep_numero_saison + numero_episode_format + sep_episode_saison + L"(" + dates_format + L"+)" + stream_format };
        const std::wregex filename_format_rg{ L"(" + dates_format + L"+)" + stream_format };
     
        const int filename_full_match_index = 0;
        const int filename_numero_saison_index = filename_full_match_index + 1;
        const int filename_numero_episode_index = filename_numero_saison_index + 1;
        const int filename_dates_index = filename_numero_episode_index + 1;
        const int filename_date_year_month_day_year_index = filename_dates_index + 2;
        const int filename_date_year_month_day_month_index = filename_date_year_month_day_year_index + 1;
        const int filename_date_year_month_day_day_index = filename_date_year_month_day_month_index + 1;
        const int filename_date_month_day_month_index = filename_date_year_month_day_day_index + 1;
        const int filename_date_month_day_day_index = filename_date_month_day_month_index + 1;
        const int filename_date_day_day_index = filename_date_month_day_day_index + 1;
        //const int filename_fucking_someFlag_index = filename_date_day_day_index + 2;
        const int filename_someFlag_index = filename_date_day_day_index + 2;
        //const int filename_stream_index = filename_fucking_someFlag_index + 2;
        const int filename_stream_index = filename_someFlag_index + 2;
     
     
        //auto nomFichier = m_cheminFichier.filename().wstring();
        auto nomFichier = m_cheminFichier./*filename().*/wstring();
     
        assert(nomFichier.length() > 0 && L"Nom de fichier Episode vide");
     
        auto stem = m_cheminFichier.stem().wstring();
        // prefixe ???
        //assert((stem.length() > (9 + std::to_wstring(prefixe).length() + sep_numero_saison.length())) && L"Nom de fichier Episode trop court pour avoir au moins une date");
        assert((stem.length() > 9) && L"Nom de fichier Episode trop court pour avoir au moins une date");
     
        assert(std::isdigit(stem[0]) && L"Nom de fichier Episode ne commençant pas par un nombre");
        //m_NumeroSaison = std::stoi(stem);
        //assert((m_NumeroSaison <= 1000) && L"x <= 1000 !!!");
        //
        //assert((m_NumeroSaison <= 1000) && L"x <= 1000 !!!");// saison == m_NumeroSaison
        //
        assert((stem.find(L"x", 0) != std::wstring::npos) && L"Saison::afficher_Episode() :  x !!!");
        //assert(((fucking_x >= prefixe)) && L"saison.first != x"); // prefixe ???
        assert(std::regex_match(stem, filename_format_rg) && L"Le nom du fichier n'est pas valide");
     
        //std::vector<DateRecord> dates_de_diffusion;
        //std::wstring streaming = L"";
     
        std::wsmatch match;
        auto str = stem;
        //Exemple assez complexe de nom de fichier
        //str = L"1x01.2024-02-01_2024-02-02_02-03_0405 Netflix";
        std::regex_match(str, match, filename_format_rg);
     
        std::wsmatch dates_match;
        auto dates_str = match[filename_dates_index].str();
        while (std::regex_search(dates_str, dates_match, std::wregex{ dates_format }))
        {
            if (dates_match[dates_date_year_month_day_year_index].matched)
            {
                auto year = std::stoi(dates_match[dates_date_year_month_day_year_index]);
                auto month = std::stoi(dates_match[dates_date_year_month_day_month_index]);
                auto day = std::stoi(dates_match[dates_date_year_month_day_day_index]);
     
                assert(checkyear(year));
                assert(checkmonth(month));
                assert(checkday(month, day, year));
     
                DateRecord dr{ {0,0,0,day,month - 1,year - 1900} };
     
                m_DatesVisionnage.emplace_back(dr);
            }
            else if (dates_match[dates_date_month_day_month_index].matched)
            {
                assert(m_DatesVisionnage.size() > 0 && L"Utilisation d'un format mois-jour sans avoir d'année déduite.");
     
                auto month = std::stoi(dates_match[dates_date_month_day_month_index]);
                auto day = std::stoi(dates_match[dates_date_month_day_day_index]);
     
                auto lastDateRecord = m_DatesVisionnage.back();
                auto last_year = lastDateRecord.date.tm_year + 1900;
     
                assert(checkmonth(month));
                assert(checkday(month, day, last_year));
     
                DateRecord dr{ {0,0,0,day,month - 1,last_year - 1900} };
     
                m_DatesVisionnage.emplace_back(dr);
            }
            else if (dates_match[dates_date_day_day_index].matched)
            {
                assert(m_DatesVisionnage.size() > 0 && L"Utilisation d'un format jour sans avoir de mois et d'années déduits.");
     
                auto day = std::stoi(dates_match[dates_date_day_day_index]);
     
                auto lastDateRecord = m_DatesVisionnage.back();
                auto last_year = lastDateRecord.date.tm_year + 1900;
                auto last_month = lastDateRecord.date.tm_mon + 1;
     
                assert(checkday(last_month, day, last_year));
     
                DateRecord dr{ {0,0,0,day,last_month - 1,last_year - 1900} };
     
                m_DatesVisionnage.emplace_back(dr);
            }
            else
            {
                assert(true && L"format de date d'épisode inconnu.");
            }
     
            //if (dates_match[dates_fucking_someFlag_index].matched)
            if (dates_match[dates_someFlag_index].matched)
            {
                m_DatesVisionnage.back().someFlag = true;
            }
     
            dates_str = dates_match.suffix().str();
        }
     
        if (match[filename_stream_index].matched)
        {
            m_streaming = match[filename_stream_index];
        }
    }
    ...
    Je suis crevé !

    Merci

  7. #867
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Septembre 02 (02/09/2024)

    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
    const void Film::Print_Date(InfosVisionnage_film date)
    {
        if (affichage_film_actif)
        {
            date.Print();
        }
    }
     
    const void Film::Print_Dates()
    {
        if (affichage_dates_actif)
        {
            for (auto d : dates)
            {
                Print_Date(d);
            }
        }
    }
    Ok !

    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
    struct InfosVisionnage_film
    {
        InfosVisionnage_film(std::filesystem::path const& m_cheminFichier);
        std::filesystem::path m_cheminFichier;
     
        //InfosVisionnage_f info_vis{ cheminFichier };
     
        void Print();
     
        std::wstring m_min = L"min";
        std::vector<std::wstring>m_keyColor{ L"\x1b[94;1m", L"\x1b[38;2;0;255;0m" }; // keyColor[0] (bleu) et keyColor[1] (vert)
        std::wstring m_valuesColor = L"\x1b[38;2;255;255;255m"; // Blanc
     
        std::vector<DateRecord> m_DatesVisionnage{ 0 };
        std::wstring m_streaming{ L"" };
    };
    Ok !

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void InfosVisionnage_film::Print()
    {
        //std::wcout << m_DatesVisionnage[0] << std::endl;
        std::wcout << m_streaming << std::endl;
    }
    ???

    Je suis crevé !!!

    Merci vraiment

  8. #868
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 205
    Points : 12 374
    Points
    12 374
    Par défaut
    Remarques sur la version "Août 28 (31/08/2024)":
    Vous changez la signature de la fonction "initialiser_Titre_Original" de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> initialiser_Titre_Original(std::filesystem::path const& cheminFichier, std::vector<std::wstring>& titre_original);
    à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initialiser_Titre_Original(std::filesystem::path const& cheminFichier, std::vector<std::wstring>& titre_original);
    Comme ce n'est pas une fonction qui initialise le champ "m_Titre_Original" (ou "m_titres_originaux"), son nom reste totalement foireux.
    La nouvelle signature n'est pas beaucoup plus lisible que la précédente.
    Avec la précédente signature, on renvoyait le résultat en valeur de retour de la fonction, permettant de faire bien plus de chose que 'mettre putativement à jour le champ "m_Titre_Original"'.
    Elle avait un paramètre "titre_original" qui "permettait" de faire un effet de bord invisible pour l'utilisateur de la fonction.
    Mais avec la nouvelle signature, l'effet de bord est toujours là et la "flexibilité" d'utilisation a été perdue.
    C'est vraiment pas super.
    Pourquoi ne pas en faire une fonction flexible d'utilisation, avec un nom "correct" et sans effets de bord ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> extraire_Titres_DepuisUnFichier(std::filesystem::path const& cheminFichier);
    Ainsi, pas d'effet de bord, et on pourra utiliser la même fonction pour un autre champ, qui utilise le même format de fichier (quitte à renommer le nom de la fonction pour qu'elle colle à son usage).

    --------------------------------------

    https://github.com/laurentbouleau/Exemple : Septembre 01 (01/09/2024) : ok !
    Cette version des sources ("tag") n'existe pas dans le dépôt GitHub.
    Ne serait-ce pas plutôt la version "Film : std::tm m_date{0} : ok !" du dépôt GitHub ???
    FAITES ATTENTION AUX NOMS DES TAGS, SVP !!!

    Que faire ?
    La question est pour la partie "Film::initialiser_Fichier" ou la partie "InfosVisionnage_film::InfosVisionnage_film" ?????
    SOYEZ PLUS PRECIS DANS VOS DEMANDES, SVP !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
    void Film::initialiser_Fichier(fs::path const& cheminFichier)
    {
    ...
    Les modifications que vous avez fait dans les sources ultérieurement semble montrer que vous maitrisez un peu le sujet.
    Mais pourquoi votre fonction "Film::initialiser_Fichier" est-elle aussi compliquée ?!?
    C'est un enfer entre les "return" au milieu de nulle part, des if/then/else imbriqués avec des conditions pas claires, et, comme d'habitude, des noms de variables foireux.
    Pourquoi pas un simple if/then/else "à plat" ??? :
    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
    void Film::initialiser_Fichier(fs::path const& cheminFichier)
    {
        auto nomFichier = cheminFichier.filename().wstring();
        auto extensionFichier = cheminFichier.extension().wstring();
    
    
        if (nomFichier == L"AD.txt")
        {
            initialiser_Audiodescription(cheminFichier, m_audiodescription);
        }
        else if (nomFichier == L"Avec.txt")
        {
            initialiser_Avec(cheminFichier, m_avec);
        }
        else if (nomFichier == L"Date de reprise.txt")
        {
            initialiser_Date_de_reprise(cheminFichier); // ???
        }
        else if (nomFichier == L"Date de sortie.txt")
        {
            initialiser_Date_de_sortie(cheminFichier);// ???
        }
        else if (nomFichier == L"De.txt")
        {
            initialiser_De(cheminFichier);
        }
        else if (nomFichier == L"Disney+.txt")
        {
            m_disney_sj = recuperer_Disney_SJ(cheminFichier);
        }
        else if (nomFichier == L"Distributeur.txt")
        {
            initialiser_Distributeur(cheminFichier);
        }
        else if (nomFichier == L"Genre.txt")
        {
            initialiser_Genre(cheminFichier, m_genre, ::Genre);
        }
        else if (nomFichier == L"Making-of.txt")
        {
            initialiser_Making_of(cheminFichier);
        }
        else if (nomFichier == L"Nationalité.txt")
        {
            initialiser_Nationalite(cheminFichier, m_nationalite, ::Nationalite);
        }
        else if (nomFichier == L"Netflix.txt")
        {
            m_netflix_sj = recuperer_Netflix_SJ(cheminFichier);
        }
        else if (nomFichier == L"Note.txt")
        {
            initialiser_Note(cheminFichier);
        }
        else if (nomFichier == L"Par.txt")
        {
            initialiser_Par(cheminFichier);
        }
        else if (nomFichier == L"SJ.txt")
        {
            m_sj = recuperer_SJ(cheminFichier);
        }
        else if (nomFichier == L"Soundtrack.txt")
        {
            initialiser_Soundtrack(cheminFichier);
        }
        else if (nomFichier == L"Titre.txt")
        {
            initialiser_Titre(cheminFichier);
        }
        else if (nomFichier == L"Titre original.txt")
        {
            initialiser_Titre_Original(cheminFichier, m_titres_originaux);
        }
        else if (nomFichier == L"_you_.txt")
        {
        }
        else if (std::regex_match(nomFichier, std::wregex{ InfosVisionnage_film::c_filenameFormat }))
        {
            InfosVisionnage_film info_vis{ cheminFichier };
            m_visionnages.push_back(info_vis);
        }
        else if (extensionFichier == L".jpg" || extensionFichier == L".png" || extensionFichier == L".webp")
        {
            initialiser_Image(cheminFichier, m_image);
        }
        else
        {
            assert(false && L"fichier inconnue");
        }
    }
    Un simple "switch" peut remplacer tout cela, si on passe par une std::map pour avoir la liste des fichiers "valides".

    InfosVisionnage_film::InfosVisionnage_film(fs::path const& m_cheminFichier)
    {...}
    Très bien d'avoir vu que la structure "InfosVisionnage" avait déjà pas mal de fonctionnalités utiles.
    Mais, on évite de faire de gros copier-coller de code.
    Il n'y a que du mauvais code qui se copie-colle facilement.

    L'approche la plus pérenne, ce n'est pas de cloner la structure "InfosVisionnage" en "InfosVisionnage_film".
    La façon la plus "logique", c'est de :
    -Créer une structure ("vide") "InfosVisionnage_serie" qui dérive de "InfosVisionnage"
    -Transférer les choses spécifiques aux séries de la classe "InfosVisionnage" à la classe "InfosVisionnage_serie"
    -Créer une structure ("vide") "InfosVisionnage_film" qui dérive de "InfosVisionnage"
    -Ajouter dans "InfosVisionnage_film" tout ce qui est spécifique aux films.

    --------------------------------------

    Remarques sur la version "Film : std::tm m_date{0} : ok !":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Film::initialiser_Distributeur(fs::path const& m_cheminFichier)
    Pourquoi avoir renommer le paramètre "cheminFichier" en "m_cheminFichier" avec ce putain de "m_", BORDEL !!!

    --------------------------------------

    Remarques sur la version "Septembre 02 (02/09/2024)":
    "Film:: Print_Date" ou "Film:: Print_Dates", etc..., on ne sait pas de quelles dates il s'agit.
    Toujours la même chose, prenez le temps de correctement nommer les choses, SVP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const void Film::Print_Date(InfosVisionnage_film date)
    {
        if (affichage_film_actif)
        {
            date.Print();
        }
    }
    Vous êtes sûr du "affichage_film_actif" ???
    J'ai déjà indiqué que ces multiples booléens "d'affichage" étaient au mieux une perte temps mais aussi un nid à bug.

  9. #869
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> extraire_Titres_Depuis_UnFichier(std::filesystem::path const& cheminFichier);
    Ok !

    https://github.com/laurentbouleau/Exemple : Septembre 03 (03/09/2024)

  10. #870
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 205
    Points : 12 374
    Points
    12 374
    Par défaut
    Les versions "Septembre 03 (03/09/2024)"
    Tous est OK pour moi.

  11. #871
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Septembre 04 (04/09/2024)
    Film.h et film.cpp : Pouvez-vous corriger ?

    Je suis fatigué !!!

    Merci vraiment

  12. #872
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    https://github.com/laurentbouleau/Exemple : Septembre 05 (05/09/2024)
    Presque !!!

    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
    const void Film::Print_Dates()
    {
        if (affichage_dates_actif)
        {
            for (auto visionnage : m_visionnages)
            {
                std::wstring DatesVisionnage_str{};
                for (auto d : visionnage.m_DatesVisionnage)
                {
                    //std::wcout << d.dr.tm_year.first.
                }
                std::wstring streaming_str{ L"" };
                std::wcout << visionnage.m_streaming << L"\r\n";
            }
        }
    }

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    ...
        //else if (std::regex_match(nomFichier, std::wregex{ InfosVisionnage_film::c_filenameFormat }))
        else if (std::regex_match(nomFichier, std::wregex{ L"^(\\d{4}\\-\\d{2}\\-\\d{2}.*)$" }))
        {
            InfosVisionnage_film info_vis{ cheminFichier };
            m_visionnages.push_back(info_vis);
        }
    ...
    Pas trouvé !!!

    Merci d'avange

  13. #873
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 205
    Points : 12 374
    Points
    12 374
    Par défaut
    Remarques sur la version "Septembre 04 (04/09/2024)":
    Vous avez ajouté le champ "m_visionnages" dans la classe "Film".
    C'est très bien, mais vous avez conservé un champ "dates" de même type.
    Ne devriez-vous pas faire disparaitre le champ "dates" et utiliser "m_visionnages" à la place.
    Vous avez mis en commentaire tout le contenu de la fonction "Film:: Print_Dates", ne devrait-elle pas devenir la fonction "PrintSequenceVisionnage" ?
    Je pense qu'il y a des modifications à faire au niveau de "InfosVisionnage_film" car il me semble que c'est plus des séquences de séances de visionnage que des "infos" de visionnage.
    Côté Serie, on n'a une séparation entre Information de Visionnage et Séquence de Visionnage car il y a la problématique de la création de l'objet "Episode", qui n'existe pas côté Film.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    InfosVisionnage_film::InfosVisionnage_film(fs::path const& m_cheminFichier)
    {
    ...
        std::pair<std::vector<DateRecord>, std::wstring>ajouter_InfosVisionnage_film(std::vector<DateRecord>&m_DatesVisionnage, std::wstring & m_streaming);
    }
    C'est quoi cette ligne ???

    La fonction "InfosVisionnage_film::ajouter_InfosVisionnage_film", elle sert à quoi ???

    Vous pouvez remplacer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if (std::regex_match(nomFichier, std::wregex{ L"^(\\d{4}\\-\\d{2}\\-\\d{2}.*)$" }))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if (std::regex_match(nomFichier, std::wregex{ InfosVisionnage_film::c_filenameFormat }))
    Si vous déclarez "correctement" c_filenameFormat :
    Dans film.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static const std::wstring c_filenameFormat;
    et dans film.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wstring InfosVisionnage_film::c_filenameFormat = L"^(\\d{4}\\-\\d{2}\\-\\d{2}.*)$";
    C'est pas la manière la plus robuste d'initialiser ce genre de variable, mais on verra ça après.
    Vous devriez ajouter '#include "film.h"' à film.cpp.


    --------------------
    Film.h et film.cpp : Pouvez-vous corriger ?
    Corriger Quoi ????
    ---------------------

    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
    const void Film::Print_Dates()
    {
        if (affichage_dates_actif)
        {
            for (auto visionnage : m_visionnages)
            {
                std::wstring DatesVisionnage_str{};
                /*for (auto d : visionnage.m_DatesVisionnage)
                {
                    std::wcout << d.dr.tm_year.first.
                }*/
                std::wstring streaming_str{ L"" };
                std::wcout << visionnage.m_streaming << L"\r\n";
            }
        }
    }
    Pourquoi n'affiché que le "stream" de visionnage ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    const void Film::Print_Dates()
    {
        if (affichage_dates_actif)
        {
            for (auto visionnage : m_visionnages)
            {
                std::wcout << visionnage.Print_Dates_de_visionnage(visionnage.m_DatesVisionnage) << L"\r\n";
            }
        }
    }
    Nom des fonctions et de leur signature à revoir.

  14. #874
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Septembre 05 (05/09/2024)

    Vous avez ajouté le champ "m_visionnages" dans la classe "Film".
    C'est très bien, mais vous avez conservé un champ "dates" de même type.
    Pourquoi ???

    PrintSequenceVisionnage
    Je pense qu'il y a des modifications à faire au niveau de "InfosVisionnage_film" car il me semble que c'est plus des séquences de séances de visionnage que des "infos" de visionnage.
    Plus tard ou demain !
    Mais : Les vacances : 07/09/2024 - 14/09/2024 !!!

    Je suis crevé !!!

    Merci vraiment

  15. #875
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 205
    Points : 12 374
    Points
    12 374
    Par défaut
    Vous avez ajouté le champ "m_visionnages" dans la classe "Film".
    C'est très bien, mais vous avez conservé un champ "dates" de même type.
    Pourquoi ???
    Pour garder les choses le plus simple possible. (KISS : Keep It Simple and Stupid)
    On n'a un truc qui sert à rien (de précis) et un truc qui sert à quelque chose : on supprime le premier.=> KISS

    PrintSequenceVisionnage
    J'ai parlé d'une fonction PrintSequenceVisionnage, pas une classe/structure.

    Je pense qu'il y a des modifications à faire au niveau de "InfosVisionnage_film" car il me semble que c'est plus des séquences de séances de visionnage que des "infos" de visionnage.
    Plus tard ou demain !
    Vous vous plantez toujours sur les priorités.
    Conserver/Rendre votre code simple et facile à maintenir est prioritaire sur l'ajout de "fonctionnalité" à grands coups de copier-coller.
    Plus vous maitrisez la programmation moins vous ferez de copier-coller et plus vous ferez de choses rapidement par la simplification de votre code, pas en y ajoutant du bordel avec des lignes en plus.

    Remarques sur lES versionS "Septembre 05 (05/09/2024)":
    Vous avez ajouté une structure "SequenceVisionnage_film", je pense qu'il aurait été bien plus judicieux de renommer la structure "InfosVisionnage_film" en "SequenceVisionnage_film".

    Je rappelle que "InfosVisionnage" permet d'avoir à la fois les informations de l'épisode d'une série et les informations des séquences de séances de visionnage d'un épisode données par le fichier (nom du fichier + contenu du fichier).
    Pour un film, il n'y pas d'informations sur un épisode => pas besoin de 2 classes pour traiter/conserver les informations données par le fichier.

  16. #876
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Pour garder les choses le plus simple possible. (KISS : Keep It Simple and Stupid)
    On n'a un truc qui sert à rien (de précis) et un truc qui sert à quelque chose : on supprime le premier.=> KISS
    ...
    Je rappelle que "InfosVisionnage" permet d'avoir à la fois les informations de l'épisode d'une série et les informations des séquences de séances de visionnage d'un épisode données par le fichier (nom du fichier + contenu du fichier).
    Pour un film, il n'y pas d'informations sur un épisode => pas besoin de 2 classes pour traiter/conserver les informations données par le fichier.
    Pas le temps !

    https://www.b-lolo.fr/2024/09/05/visual-studio-2022-c-console-film/
    Et :
    https://www.developpez.net/forums/d2109979/c-cpp/cpp/probleme-avc-_wfopen_s/

    Facebook : laurent.bouleau.7

    https://github.com/laurentbouleau/Exemple : Septembre 06 (06/09/2024)

    À propos :
    film_serie.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void initialiser_Avec(fs::path const& cheminFichier, std::vector<std::pair<std::wstring, std::wstring>>& m_avec)
    {
        auto nomFichier = cheminFichier.filename().wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        m_avec = lire_paireCleValeur_depuisFichierTxt(cheminFichier.wstring(), L" : ");
        assert((m_avec.size() != 0));
    }
    ou
    utils.cpp
    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
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)
    {
        std::string contenuFichier{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
     
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
     
        contenuFichier = std::string(istreambuf_iterator<char>{fichier}, {});
     
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
     
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
        converti += L"\r\n";
     
        std::size_t pos = converti.length();
     
        if (pos == std::wstring::npos)
            return clevaleurs;
     
        std::size_t pos2 = 0;
        while (pos = converti.find(L"\n"))
        {
            if (converti[0] != converti.length())
            {
                pos2 = converti.find(L"...");
                if (pos2 != std::wstring::npos && converti[0] == L'.' && converti[1] == L'.' && converti[2] == L'.')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                pos2 = converti.find(L"…");
                if (pos2 != std::wstring::npos && converti[0] == L'')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                pos2 = converti.find(L".");
                if (pos2 != std::wstring::npos && converti[0] == L'')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                pos2 = converti.find(separeteur);
                if (pos2 == std::wstring::npos && pos != std::wstring::npos)
                {
                    clevaleurs.push_back(std::make_pair(converti.substr(0, pos - 1), L""));
                }
                else if (pos2 == 0)
                {
                    clevaleurs.push_back(std::make_pair(L"", converti.substr(3, (pos - 1) - 2)));
                }
                else if (pos > pos2)
                {
                    clevaleurs.push_back(std::make_pair(converti.substr(0, pos2), converti.substr(pos2 + 3, pos - (pos2 + 3))));
                }
                else
                {
                    break;
                }
                converti = converti.substr(pos + 1);
            }
            else
                break;
        }
        return clevaleurs;
    }
    Problème ???

    Mais :
    Nom : Visual Studio 2022 - C++ Console - Film.png
Affichages : 70
Taille : 53,8 Ko
    Liang Yang (FN-2199
    ???

    Merci beaucoup

  17. #877
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 205
    Points : 12 374
    Points
    12 374
    Par défaut
    Liang Yang (FN-2199
    ???
    Vous n'avez pas remarqué le plus important :
    Nom : developpez11.png
Affichages : 62
Taille : 82,9 Ko
    Remarquez la zone en bas à gauche, cerclée de rouge.

    Le problème, c'est que vous avez un "\r" sans "\n" dans une console Windows.

    L'origine du problème est à la ligne :
    dans la fonction "lire_paireCleValeur_depuisFichierTxt"

    Vous utilisez un "ifstream" qui convertit les "\r\n" dans les fichiers texte en "\n".

    La boucle "while" dans le fonction "lire_paireCleValeur_depuisFichierTxt" ne gère correctement que l'utilisation de "\n" (sans \r").

    A la fin, vous avez, pour le fichier ".\Star Wars - Episode VII - Le réveil de la force.(2015-12-16)\Avec.txt", "Liang Yang : FN-2199\r\n" comme dernière ligne.
    Votre code découpe cette ligne en {"Liang Yang","FN-2199\r"}
    C'est ainsi que votre affichage est foiré, à cause de ce "\r" qui traine.

    Vous collez des "\r\n" un peu n'importe comment avec du code à base de "std::find" qui est bien moins robuste que ceux à base d'expressions régulières.

    Vous avez la cause, essayez de concevoir une solution qui ne complexifie pas inutilement les choses.

  18. #878
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonsoir bacelar,

    Ici : https://www.b-lolo.fr/2024/09/14/du-...s-a-merlimont/. Ok ! Terminer !!!

    Maintenant :
    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
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)
    {
    ...
        ifstream fichier{ nomFichier };
    ...
        converti += L'\n';/*L"\r\n"*/;
    
        std::size_t pos = converti.length();
    
        if (pos == std::wstring::npos)
            return clevaleurs;
    
        std::size_t pos2 = 0;
        while (pos = converti.find(L"\n"/*L"\r\n"*/))
        {
            if (converti[0] != converti.length())
            {
                pos2 = converti.find(L"...");
                if (pos2 != std::wstring::npos && converti[0] == L'.' && converti[1] == L'.' && converti[2] == L'.')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                pos2 = converti.find(L"…");
                if (pos2 != std::wstring::npos && converti[0] == L'…')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                pos2 = converti.find(L".");
                if (pos2 != std::wstring::npos && converti[0] == L'…')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                pos2 = converti.find(separeteur);
                if (pos2 == std::wstring::npos && pos != std::wstring::npos)
                {
                    clevaleurs.push_back(std::make_pair(converti.substr(0, pos - 1), L""));
                }
                else if (pos2 == 0)
                {
                    clevaleurs.push_back(std::make_pair(L"", converti.substr(3, (pos - 1) - 2)));
                }
                else if (pos > pos2)
                {
                    clevaleurs.push_back(std::make_pair(converti.substr(0, pos2), converti.substr(pos2 + 3, pos - (pos2 + 3))));
                }
                else
                {
                    break;
                }
                converti = converti.substr(pos + 1);
            }
            else
                break;
        }
        return clevaleurs;
    }
    Ok ou pas ?

    Vous collez des "\r\n" un peu n'importe comment avec du code à base de "std::find" qui est bien moins robuste que ceux à base d'expressions régulières.
    J'ai oublié ! Comment faire (expressions régulières) ?

    Je suis crevé

    Merci beaucoup

  19. #879
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    https://github.com/laurentbouleau/Exemple : Septembre 08 (20/09/2024)

    Nom : Capture d’écran 2024-09-20 094927.png
Affichages : 37
Taille : 4,3 Ko

    ===> L"01/05/2018 : __VOD Orange

    Merci

  20. #880
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur de déploiement réseaux
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 630
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Septembre 09 (20/09/2024)

    film.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    std::wstring InfosVisionnage_film::Print_Dates_de_visionnage(std::vector<DateRecord>& m_DatesVisionnage)
    {
    ...
        //const std::wstring streaming_format = m_keyColor[1] + L" : " + m_valuesColor + L"%s";
        const std::wstring streaming_format = m_keyColor[1] + L" :" + m_valuesColor + L"%s";
    ...
    }
    Ok !

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probléme avc la formclosing
    Par dv-2008 dans le forum VB.NET
    Réponses: 2
    Dernier message: 23/03/2008, 17h33
  2. probléme avc console.readline()
    Par dv-2008 dans le forum VB.NET
    Réponses: 7
    Dernier message: 10/03/2008, 01h33
  3. j'ai un probléme avc un code vb.net aider moi svp
    Par dv-2008 dans le forum VB.NET
    Réponses: 12
    Dernier message: 29/01/2008, 10h20
  4. Problème avc une requête
    Par Raiga dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 30/06/2007, 19h36
  5. Toujours problème de lien avce la lib Cblas
    Par Kirou dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 19/06/2007, 15h50

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