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. #781
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    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 141
    Points : 12 245
    Points
    12 245
    Par défaut
    Expliquez-moi !
    Pouvez-vous être plus précis, SVP ?

    La fonction "Episode:: Print" est là pour afficher dans la console les informations contenus dans l'objet Episode.
    Comme "Serie:: Print" ou Saison:: Print".
    Dans ces fonctions, vous avez conçus toutes une collection de fonctions chargées d'afficher tel ou tel élément d'une série ou d'une saison :
    Serie:: Print_Header();
    Serie:: Print_Titre_Original(m_titres_originaux, affichage_titres_originaux_actif, keyColor, valuesColor);
    Serie:: Print_Chaine();
    Serie:: Print_Audiodescription(m_audiodescription, affichage_audiodescription_actif, keyColor[0], valuesColor);
    Serie:: Print_Creee_par();
    Serie:: Print_Genres(m_genre, affichage_genres_actif, m_sous_genre, affichage_sous_genre_actif, keyColor[0], valuesColor);
    Serie:: Print_En_relation_avec();
    Serie:: Print_Nationalites(m_nationalite, affichage_nationalite_actif, keyColor[0], valuesColor);
    Serie:: Print_Images(m_image, affichage_image_actif, keyColor[0], valuesColor);
    Serie:: Print_Resume
    Saison:: Print_Note();
    Saison:: Print_Chaine();
    Saison:: Print_Netflix();
    Saison:: Print_Images();
    Saison:: Print_Avec();

    Vous devriez faire la même chose pour les informations stockées dans un épisode comme :
    son "numéro"
    sa "durée"
    son "résumé"
    etc...
    PrintData, c'est juste une fonction "factice" que vous devez remplacer par ce qui est nécessaire, comme les autres fonctions "Serie:: Print_xxx" ou "Saison:: Print_xxx" que vous avez réussit à concevoir sans mon aide.
    (moi, j'aurais fait bien moins de fonction de ce type)

    Si vous n'en créez aucune, l'affiche d'un épisode se résumerait à l'affichage des sessions de visionnage de cet épisode. Pas terrible.


    Pour le plantage dont vous donnez la pile d'appel, le problème est un peu plus loin que dans "Episode:: Print()" dans le pile d'appel.
    dans : "Saison:: Print()"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     std::size_t taille;
     taille = std::size(m_liste_episodes);
     for (auto i = 0; i < taille; i++)
     {
         m_liste_episodes[i]->Print();
     }
    Votre code fait l'assertion qu'il n'y a pas de "trou" dans les numéros d'épisode et qu'il commence à l'épisode numéro "0".
    'm_liste_episodes[0]" n'existe pas, mais "std::map" essaye de vous aider en créant à la voler le "std::shared_ptr<Episode>" qui manque avec un pointeur "par défaut", qui n'est pas fonctionnel.
    Vous plantez donc quand vous essayez d'accèder aux champs de l'épisode qui n'existe pas.

    Ce n'est pas avec une boucle "for classique" que vous devez itérer sur une "std::map" mais avec une "range-based for loop" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (auto episode : m_liste_episodes)
    {
        episode.second->Print();
    }
    P.S.: rien ne s'affiche de plus car vous n'affichez rien dans les objets "Episode" et "Séquence de Visionnage".

  2. #782
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Juillet 10 (10/07/2024)
    Comprends rien !!!

    Pour quant (beaucoup) (saison) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
    {
    ...
    }
    et un seul !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void SequenceVisionnage::Print()
    {
    ...
    }
    Donc,
    Nom : Capture d’écran 2024-07-11 124311.png
Affichages : 130
Taille : 13,7 Ko
    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
    struct SequenceVisionnage
    { // ???
        SequenceVisionnage(const Episode& episode, const InfosVisionnage& info_vis) :
            m_episode{ m_episode }, m_titres{info_vis.m_titres}, m_streaming{info_vis.m_streaming},
            m_duree_en_seconde{ info_vis.m_duree * 60 }, m_resume{ info_vis.m_resume },
            m_DatesVisionnage{ info_vis.m_DatesVisionnage }
        {};
    
        void Print();
        std::wstring Print_Dates_de_visionnage(std::vector<DateRecord>& dr);
        bool Print_Titre_chiffre_et_point_ou_pas(int episode);
    
        std::wstring m_min = L"min";
        std::vector<std::wstring>keyColor{ L"\x1b[94;1m", L"\x1b[38;2;0;255;0m" }; // keyColor[0] (bleu) et keyColor[1] (vert)
        std::wstring valuesColor = L"\x1b[38;2;255;255;255m"; // Blanc
    
        std::wstring m_streaming{ L"" };
        //bool m_fichier_pas_zero{ false };
        //std::wstring m_titre;
        //std::wstring m_deux_points;
        //std::wstring m_sous_titre;
        std::vector<std::wstring> m_titres;
        long m_duree_en_seconde{ -1 };
        std::vector<std::wstring> m_resume{};
        std::vector<DateRecord> m_DatesVisionnage{};
    
        int m_saison{ -1 };
        int m_episode{ -1 };
        int m_numero{ -1 };
        long m_duree{ -1 };
        
    private:
        //const Episode& m_episode; // ???
    };
    Et :
    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
    ...
    void SequenceVisionnage::Print()
    {
        std::wstring wstr;
        bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(m_numero);
        if (chiffre_et_point_ou_pas)
        {
            wstr = std::to_wstring(m_saison) + keyColor[1] + L'x' + valuesColor + std::to_wstring(m_episode) + keyColor[1] + L" : " + valuesColor;
        }
        bool found = false;
        if (!found && m_titres.size() == 0)
            found = true;
        if (!found && m_titres.size() == 1)
        {
            found = true;
            wstr += keyColor[1] + m_titres[0] + valuesColor;
        }
        else
        {
            found = true;
            wstr += m_titres[1] + keyColor[1] + m_titres[2] + valuesColor;
        }
        if (m_numero == 1)
        {
            wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(m_duree_en_seconde / 60) + keyColor[1] + m_min + L')' + valuesColor;
        }
        else
        {
            wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(m_numero++) + keyColor[1] + L']' + valuesColor;
            //wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(m_saison_episode.m_numero++) + keyColor[1] + L']' + valuesColor;
    //        wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(m_saison.m_numero++) + keyColor[1] + L']' + valuesColor;
            //wstr += keyColor[1] + L" [" + valuesColor + std::to_wstring(1 + saison_episode.numero++) + keyColor[1] + L']' + valuesColor;
            m_numero++;
            //saison_episode.numero++;
        }
        wstr += keyColor[1] + L" : " + valuesColor;
        wstr += Print_Dates_de_visionnage(m_DatesVisionnage);
    
        // m_resume
        if (m_numero == 1)//titre != L"")
        {
    //        std::wstring resume_str;
    //        wstr += L"\r\n" /* + m_resume*/;
    //        for (auto r : m_resume)
    //            resume_str += r;
     //       wstr += resume_str;
            //saison_episode.numero = 1;
        }
        std::wstring resume_str;
        if (m_resume.size() != 0)
        { // ???
            for (auto r : m_resume)
                resume_str += r;
        }
    
        std::wcout << wstr << resume_str << L"\r\n";
    }
    ...
    void Saison::ajouter_InfosVisionnage(SequenceVisionnage const& seq_vis)
    { // ???
        //m_liste_episodes.insert({ 1, seq_vis });
        //m_liste_episodes.insert({ 1, seq_vis });
        //m_numero++;
        //auto [xxx, success] = m_liste_episodes.insert({ m_numero, seq_vis });
        //m_liste_episodes.insert(std::pair<int, Episode>(m_numero, seq_vis));
        //m_liste_episodes.insert({ m_numero, seq_vis });
    }
    ...
    Etc...
    Je suis perdus !!!
    Désolé !!!

    Merci

  3. #783
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    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 141
    Points : 12 245
    Points
    12 245
    Par défaut
    Pas de panique.
    Si vous avez des questions plus précises, ça serait plus efficace.

    On va essayer d'être synthétique.
    Avez-vous les connaissances de base de la programmation objet ? (classe, fonction de classe, membre d'une classe)
    Sinon, il faudrait apprendre le principe de ces notions.

    Il y a pas mal de "grosses boulettes" dans le code que vous avez posté sur Git.
    Exemple :
    • Vous avez "converti" le champ "m_episode" d'une "const Episode&" en un "int".
      Pourquoi ?
      Un épisode, c'est bien plus qu'un nombre !
      En plus vous avez initialisé ce champ de type "int" avec des données "foireuses":
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      SequenceVisionnage(const Episode& episode, const InfosVisionnage& info_vis) :
              m_episode{ m_episode },...
      Vous initialisez le champ avec le contenu du champ, qui n'est pas initialisé. WTF ???

      Le code d'avant était bien plus "logique" :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      SequenceVisionnage(const Episode& episode, const InfosVisionnage& info_vis) :
              m_episode{ m_episode },...
      Ici, on initialise m_episode avec le paramètre du constructeur, ce paramètre, c'est l'objet de type "Episode" qui représente l'épisode dont la "séquence de visualisation" (celle qu'on est en train de construire, vu qu'on est dans son constructeur).
      Avec ce champ" m_episode" de type "const Episode&", on a accès à toutes les informations publiques stockées par un objet de type "Episode".
      Cela change un peu la manière dont on récupère ces infos :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      wstr = std::to_wstring(m_saison) + keyColor[1] + L'x' + valuesColor + std::to_wstring(m_episode) + keyColor[1] + L" : " + valuesColor;
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      wstr = std::to_wstring(m_episode.m_saison.m_numero) + keyColor[1] + L'x' + valuesColor + std::to_wstring(m_episode.m_numero) + keyColor[1] + L" : " + valuesColor;





    • Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      bool found = false;
      if (!found && m_titres.size() == 0)
          found = true;
      if (!found && m_titres.size() == 1)
      {
          found = true;
          wstr += keyColor[1] + m_titres[0] + valuesColor;
      }
      else
      {
          found = true;
          wstr += m_titres[1] + keyColor[1] + m_titres[2] + valuesColor;
      }
      Qu'est-ce qui se passe si vous avez 2 éléments dans "m_titres" ?
      Ça plante.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      bool found = false;
      if (!found && m_titres.size() == 0)
          found = true;
      if (!found && m_titres.size() == 1)
      {
          found = true;
          wstr += keyColor[1] + m_titres[0] + valuesColor;
      }
      else
      {
          found = true;
          wstr += m_titres[0] + keyColor[1] + m_titres[1] + valuesColor;
      }
      (Pas top comme code)

    • etc...


    Pouvez-vous expliquer ce que vous avez compris du fonctionnement actuel de votre programme ?
    Je pourrais voir là où vous faites fausse route dans votre compréhension du programme.

    Pour quant (beaucoup) (saison) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
    {
    ...
    }
    C'est le constructeur de InfosVisionnage. C'est appelé pour chaque fichier dont le nom respecte la règle de construction des informations de visionnage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    if (std::regex_match(nomFichier, std::wregex{L"([[:digit:]]{1,2})x(.)+"}))
    {
        InfosVisionnage info_vis{ *this, cheminFichier };
        if (m_liste_episodes.find(info_vis.m_NumeroEpisode) != m_liste_episodes.end())
        {
            m_liste_episodes[info_vis.m_NumeroEpisode]->ajouter_SequenceVisionnage(info_vis);
        }
        else
        {
            m_liste_episodes.emplace(std::pair<const int, shared_ptr<Episode>>{ info_vis.m_NumeroEpisode, make_shared<Episode>(info_vis) });
        }
        return;
    }
    et un seul !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void SequenceVisionnage::Print()
    {
    ...
    }
    C'est appelé pour chacune de séquence de visionnage de chacun des épisodes de chacune des saisons de chacune des séries :
    Ça fait donc un paquet d'appel. (Normalement autant que de création d'objet "SequenceVisionnage").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    struct SequenceVisionnage
    { // ???
    Pourquoi avoir changer le type de m_episode ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void SequenceVisionnage::Print()
    {...
    Pouvez-vous m'expliquer la logique d'utilisation du champ "m_numero" ??? (C'est complètement foireux, je pense)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void Saison::ajouter_InfosVisionnage(SequenceVisionnage const& seq_vis)
    {...
    Ca sert à quoi ???

    Il semble que l'affichage des informations d'une séquence de visionnage ne dépend pas uniquement du contenu d'un objet "SequenceVisionnage" mais de sa place dans l'ordre de l'ensemble des séquences de visionnage d'un épisode.
    Dans ce cas, il faudrait mieux "supprimer/modifier la logique" de la fonction "SequenceVisionnage:: Print" car l'objet n'a pas toutes les billes et le code en devient trop complexe.
    Si on transfert l'affichage d'une SequenceVisionnage de la fonction "SequenceVisionnage:: Print" à une fonction "Episode:: PrintFirstSequenceVisionnage" pour la première séquence de visionnage et "Episode:: PrintSequenceVisionnage" pour les autres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Episode::Print()
    {
        for (auto vis : m_liste_sequence_visionnages)
        {
            vis.Print();
        }
    }
    deviendrait
    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
    void Episode::Print()
    {
        bool first = true;
        for (auto vis : m_liste_sequence_visionnages)
        {
            if(first)
            {
                PrintFirstSequenceVisionnage(vis);
            }
            else
            {
                PrintSequenceVisionnage(vis);
            }
            first = false;
        }
    }

  4. #784
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    On va essayer d'être synthétique.
    Avez-vous les connaissances de base de la programmation objet ? (classe, fonction de classe, membre d'une classe)
    Sinon, il faudrait apprendre le principe de ces notions.
    Un petit peu ! L'AVC !
    Et '.' (LIST) :
    • Vous avec "coversi" le...
      ...
      Avec ce champ" m_episode" de type "const Episode&", on a accès à

    Aie !!! Narrateur est planté ou cassé Alors...

    Pouvez-vous expliquer ce que vous avez compris du fonctionnement actuel de votre programme ?
    Je pourrais voir là où vous faites fausse route dans votre compréhension du programme.
    Exemple :

    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
    struct InfosVisionnage :[LIST]
    {
    ...
        unsigned short int m_NumeroSaison{};
        unsigned short int m_NumeroEpisode{}; 
    ...
        int m_numero{ -1 };
    ...
    };
     
    struct SequenceVisionnage
    {
    ...
       int m_numero{ -1 };
    ...
    };
    ...
    Comment faire ???

    Je suis fatigué !!!

    C'est appelé pour chacune de séquence de visionnage de chacun des épisodes de chacune des saisons de chacune des séries :
    Ça fait donc un paquet d'appel. (Normalement autant que de création d'objet "SequenceVisionnage").
    Ok !!!

    Pourquoi avoir changer le type de m_episode ???
    Pouvez-vous expliquer ?

    Pouvez-vous m'expliquer la logique d'utilisation du champ "m_numero" ??? (C'est complètement foireux, je pense)
    Ben oui !!!

    Ca sert à quoi ???

    Il semble que l'affichage des informations d'une séquence de visionnage ne dépend pas uniquement du contenu d'un objet "SequenceVisionnage" mais de sa place dans l'ordre de l'ensemble des séquences de visionnage d'un épisode.
    Dans ce cas, il faudrait mieux "supprimer/modifier la logique" de la fonction "SequenceVisionnage:: Print" car l'objet n'a pas toutes les billes et le code en devient trop complexe.
    Si on transfert l'affichage d'une SequenceVisionnage de la fonction "SequenceVisionnage:: Print" à une fonction "Episode:: PrintFirstSequenceVisionnage" pour la première séquence de visionnage et "Episode:: PrintSequenceVisionnage" pour les autres :
    Ah !!!
    Comment faire ?

    Nom : Capture d’écran 2024-07-11 222715.png
Affichages : 117
Taille : 121,4 Ko

    https://github.com/laurentbouleau/Exemple : Juillet 11 (11/07/2024)

    Merci

  5. #785
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Excusez-moi !
    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
    InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
    {
    ...
        std::vector<std::wstring> file_content = lire_fichierTxt(m_cheminFichier.wstring(), { L"\n" }, false);
        m_NumeroEpisode = std::stoi(match[filename_numero_episode_index]);
        if (file_content.size() > 0)
        {
            std::wsmatch soustitre_match;
            const std::wregex soustitre_format_rg{ L"(?:(\\d+)\\.)?(.+)(?:\\s?\\:\\s|/|\\s\\-\\s)(.+)" };
            if (std::regex_match(file_content[0], soustitre_match, soustitre_format_rg))
            {
                m_NumeroEpisode = soustitre_match[1].matched ? std::stoi(soustitre_match[1]) : 0;
                m_titres.push_back(soustitre_match[2]);
                m_titres.push_back(soustitre_match[3]);
            }
            else
            {
                m_titres.push_back(file_content[0]);
            }
        }
    ...
    }
    et pas :
    La phrase : verbre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wregex soustitre_format_rg{ L"(?:(\\d+)\\.)?(.+)(?:\\s?\\:\\s|/|\\s\\-\\s)(.+)" };
    Que faire ?
    Pas dormis !

    Merci

  6. #786
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Ou :
    La phrase: verber
    ou
    La phrase/verber
    ou
    La phrase / verber
    ou
    La phrase - verber
    ou
    La phrase - verber

  7. #787
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    bacelar : 02/07/2024, 15h36
    Je viens de comprendre le "problème" avec le nom de répertoire "Azertyuiop £££.[2024].Mini-série".
    Effectivement, l'expression régulière, que j'ai donné, ne fonctionne pas sur ce nom car elle attends toujours un espace entre la ou les années et le nom du canal de diffusion.
    Ici, ce n'est pas le cas.
    Faut juste rendre cet espace optionnel.
    J'ai aussi mis la formule pouvant récupérer les 2 années avant les autres pour gérer la priorité de capture :
    (.+?)(?:\.\[(\d{4}\-\d{4}\s?|\d{4}\-\s?|\d{4}\s?)?([^\]]*)\])?(?:\.(.+))?
    Marches pas !!!

  8. #788
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    Question :
    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
    Saison::Saison(fs::path const& cheminFichier, const Serie& serie) : m_serie{ serie }
    {
    ...
        std::wregex filename_pattern{ L"???" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
        ???
    ...
        wchar_t sp = L' ', tiret = L'-';
        auto y = std::stoi(wstr, &pos);
        assert(1582 <= y && L"L'année est inférieur !");
        m_f_anneesDiffusion = y;
    ...
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
    }
    Avec :
    2021
    2021 abc
    2021-02
    2021-02 abc
    2021-02-30
    2021-02-30 abc

    Ok ou pas !

    Merci beaucoup

  9. #789
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    Exemple (film) :
    Star Wars- The Clone Wars.(2008-08-27).Animation

    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
    int wmain(int argc, wchar_t* argv[])
    {
    ...
        //    Film film(racine);
        std::wregex film_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\-\\d{2}\\-\\d{2}\\s)?([^\\]]*)\\])?(?:\\.(.+))?" }; // ???
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, film_pattern))
        {
            std::wcout << nomDossier << std::endl;
            std::wcout << L"\r\n";
            std::wcout << L"Ok !!!" << L"\r\n";
            return EXIT_SUCCESS;
    
        }
    
    ...
    }

    https://en.cppreference.com/w/cpp/regex : Complexe !!! Alors...

    https://regex101.com ???

    Je suis crevé ! Mais, bon

    https://github.com/laurentbouleau/Exemple : Juillet 12 (13/07/2024)

    Merci

  10. #790
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    https://github.com/laurentbouleau/Exemple : Juillet 13 (14/07/2024)

    std::regex : L".(" et L")" : Tant pis !!!

    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
     Film film(racine);
    ...
    Ok !

    Merci

  11. #791
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 141
    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 141
    Points : 12 245
    Points
    12 245
    Par défaut
    Un petit peu ! L'AVC !
    Et '.' (LIST) :
    • Vous avec "coversi" le...
      ...
      Avec ce champ" m_episode" de type "const Episode&", on a accès à


    Aie !!! Narrateur est planté ou cassé Alors...
    Vous ne pouvez pas lire les posts avec des listes à puces (LIST) ou vous ne pouvez pas répondre "facilement" à ces posts ?

    Je vais donc éviter de les utiliser.
    Répondez à la question précédente, SVP. Pour savoir si je dois reformuler ces réponses.

    Bonsoir,

    On va essayer d'être synthétique.
    Avez-vous les connaissances de base de la programmation objet ? (classe, fonction de classe, membre d'une classe)
    Sinon, il faudrait apprendre le principe de ces notions.
    Un petit peu ! L'AVC !
    Pouvez-vous résumer en quelques mots ce qu'est une structure en C ?
    Quelles différences entre une structure C et une structure en C++, toujours en quelques mots ?


    Pouvez-vous expliquer ce que vous avez compris du fonctionnement actuel de votre programme ?
    Je pourrais voir là où vous faites fausse route dans votre compréhension du programme.
    (BIS)
    Vous n'avez pas répondu.
    J'attends une explication succincte du fonctionnement du programme, SVP.

    Exemple :

    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
    struct InfosVisionnage :[LIST]
    {
    ...
        unsigned short int m_NumeroSaison{};
        unsigned short int m_NumeroEpisode{}; 
    ...
        int m_numero{ -1 };
    ...
    };
     
    struct SequenceVisionnage
    {
    ...
       int m_numero{ -1 };
    ...
    };
    ...
    Comment faire ???
    Plutôt que d'avoir 10 fois la même information à 10 endroits différents, l'objectif est d'avoir l'information "correcte" à un seul endroit, facile d'accès.
    J'espère que vous vous êtes rendu compte que le processus de construction des objets lors du scan du système de fichier est là pour construire une arborescence d'objets.
    Vous avez des objets "Serie" qui "contiennent" chacune les objets Saison de la Serie "contenant" la saison. Un objet Saison par saison constituant la Serie. Les objets Saison contiennent chacun les objet Episode constituant la saison. Les Episodes contiennent les séquences de visionnage de cet épisode.
    Vous avez un objet "Serie" par série. Votre fonction "wmain", dans "Exemple.cpp" ne scanne qu'un répertoire, vous aurez donc construit qu'un seul objet Serie.
    Vous construisez l'arborescence des autres objets dans cette boucle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (const auto& entry_serie : fs::directory_iterator((serie.getRacine())))
    {
           ....
    }
    Depuis un objet Serie, le champ "saisons" contient l'ensemble des saisons de la serie.
    Depuis un objet Saison, le champ "m_liste_episodes" contient l'ensemble des épisodes de la Saison.
    Depuis un objet Episode, le champ "m_liste_sequence_visionnages" contient l'ensemble des sessions de visionnage de l'épisode.
    Pendant la construction de l'arborescence, on a pris soin de stocker le lien inverse de l'arborescence, pour pouvoir "remonter" l'arborescence.
    Depuis un objet Saison, on obtient la Serie contenant la saison via son champ "m_serie".
    Depuis un objet Episode, on obtient la saison contenant l'épisode via son champ "m_saison".
    Depuis un objet SequenceVisionnage, on obtient l'épisode correspondant à la séquence de visionnage via son champ "m_episode".

    On peut donc facilement obtenir toutes les informations depuis une séquence de visionnage :
    Des informations sur l'épisode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void SequenceVisionnage::UneFonctionDeLaClasseSequenceVisionnage(...)
    {
        ...
        auto uneInfoDeLEpisode = m_episode.lInfoQuiMInteresse;
        ...
    }
    Des informations sur la saison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void SequenceVisionnage::UneFonctionDeLaClasseSequenceVisionnage(...)
    {
        ...
        auto uneInfoDeLaSaison = m_episode.m_saison.lInfoQuiMInteresse;
        ...
    }
    Des informations sur la série :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void SequenceVisionnage::UneFonctionDeLaClasseSequenceVisionnage(...)
    {
        ...
        auto uneInfoDeLaSerie = m_episode.m_saison.m_serie.lInfoQuiMInteresse;
        ...
    }
    Cela fonction à n'importe quel niveau de l'arborescence et on peut "naviguer" dans l'arborescence dans les 2 sens :
    Serie => Saison :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const void Serie::Print_Saisons()
    {
        if (affichage_saisons_actif)
        {
            std::size_t taille;
            taille = std::size(saisons);
            for (int i = 0; i < taille; i++)
            {
                Print_Saison(saisons[i]);
            }
        }
    }
    (foireuse cette boucle, utilisez plutôt une "range-based for loop")

    Saison => Episode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Saison::Print()
    {
        ...
        for (auto episode : m_liste_episodes)
        {
            episode.second->Print();
        }
        ....
    }
    Episode => Séquence de Visionnage
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Episode::Print()
    {
        for (auto vis : m_liste_sequence_visionnages)
        {
            vis.Print();
        }
    }
    Tout ceci n'est donc pas "nouveau".
    Si ce n'est toujours pas clair, cette notion d'accès aux informations dans une arborescence d'objet, pouvez-vous poser des cas concrets qui vous posent problème ?
    Ceux que je vais citer ci-après, c'est des cas un peu "spéciaux".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct InfosVisionnage
    {
    ...
        unsigned short int m_NumeroSaison{};
        unsigned short int m_NumeroEpisode{}; 
    ...
        int m_numero{ -1 };
    ...
    };
    La classe InfosVisionnage est un cas spécial car on l'utilise à un moment ou on ne sait pas si elle représente juste une séquence de visionnage ou un Episode et une séquence de visionnage.
    On peut donc facilement avoir accès aux informations de la saison via un code comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void InfosVisionnage::UneFonctionDeLaClasseInfosVisionnage(...)
    {
        ...
        auto uneInfoDeLaSaison = m_saison.lInfoQuiMInteresse;
        ...
    }
    Donc votre champ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unsigned short int m_NumeroSaison{};
    ne présente aucun intérêt, à par complexifier le code pour l'initialiser et le maintenir à jour.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void InfosVisionnage::UneFonctionDeLaClasseInfosVisionnage(...)
    {
        ...
        auto NumeroSaison= m_saison.m_numero;
        ...
    }
    Le code ci-dessus fait largement le travail sans avoir à vous trimballer un Xème champ qui n'a rien à voir avec l'objet.

    Je suis très dubitatif sur l'utilité d'avoir accès à un numéro d'épisode dans un "InfosVisionnage" quand on ne sait pas encore si lui-même (l'"InfosVisionnage") représente juste une séquence de visionnage ou un Episode et une séquence de visionnage.
    Ce n'est pas le cas quand on n'est dans la classe "SequenceVisionnage" mais, dans ce cas, on dispose d'un champ "m_episode" qui fait le travail.

    Quand une conception rend difficile des choses qui n'ont pas de sens mais simple les cas d'usage logique, c'est que la conception est bonne.
    Ici, je trouve que c'est le cas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct SequenceVisionnage
    {
    ...
       int m_numero{ -1 };
    ...
    };
    De quel "numero" on parle ???
    Si c'est le numéro de l'épisode, on a déjà répondu avec un "m_saison.m_numero".
    Pour moi, un "numéro" n'a aucun sens au niveau d'une séquence de visionnage.
    Si c'est pour classer chronologiquement les séquences de visionnage, ce numéro devrait changer à chaque fois qu'une séquence de visionnage plus ancienne est ajoutée, un enfer.
    Si c'est vraiment utile, vous pouvez toujours vous adresser à l'épisode qui, lui, a une vue d'ensemble de toutes les "séquences de visionnage" de l'épisode.
    En implémentant une fonction "GetNumero" au niveau de l'épisode, ça devrait le faire, si c'est nécessaire.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int Episode::GetNumeroSequenceVisionnage(const SequenceVisionnage& sev_vis)
    {
        ...
    }
    Et vous n'aurez qu'à appeler pour avoir une information à jour et fiable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void SequenceVisionnage::UneFonctionDeLaClasseSequenceVisionnage(...)
    {
        ...
        auto NumeroSequenceVisionnage = m_episode.GetNumeroSequenceVisionnage(*this);
        ...
    }
    Comment faire ???
    Donc, ça dépend. Mais quand c'est compliqué, c'est vraisemblablement que vous avez un problème de conception ou que vous vous prenez la tête sur un "faux" problème.

    Pourquoi avoir changer le type de m_episode ???
    Pouvez-vous expliquer ?
    C'est vous qui avez changé le type de m_episode !
    C'est donc à vous de nous expliquer pourquoi vous l'avez changé.
    Moi, je pense que vous auriez pas dû.

    Bon, il semble que vous êtes revenu sur cette action dans les dernières versions des sources.

    Pouvez-vous m'expliquer la logique d'utilisation du champ "m_numero" ??? (C'est complètement foireux, je pense)
    Ben oui !!!
    Alors, si je comprends bien :
    On initialise le champ à -1 au moment de la construction de l'objet.
    On fait absolument rien avec jusqu'à l'appel de la fonction "SequenceVisionnage:: Print()", en fin du cycle de vie de l'objet.
    On appel dans cette fonction "SequenceVisionnage:: Print_Titre_chiffre_et_point_ou_pas"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void SequenceVisionnage::Print()
    {
    ...
        bool chiffre_et_point_ou_pas = Print_Titre_chiffre_et_point_ou_pas(m_numero);
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    bool SequenceVisionnage::Print_Titre_chiffre_et_point_ou_pas(int episode)
    {
        if (episode == 0)
            return false;
        return true;
    }
    Comme le paramètre "episode" est toujours égale à "-1", donc _"chiffre_et_point_ou_pas" est toujours égale à "true".
    Pourquoi s'embêter avec tout ça, juste pour toujours avoir le même début de chaine d'affichage ???
    Ligne 346 de serie.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (m_numero == 1) 
    {
    ....
    }
    On n'entre jamais dans le if.
    Donc toujours s'embêter pour rien.
    Ligne 353 de serie.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    duree_str += keyColor[1] + L" [" + valuesColor + std::to_wstring(m_numero) + keyColor[1] + L']' + valuesColor;
    Tout ça pour toujours afficher un "-1" ???
    Il y a beaucoup beaucoup plus simple, non ?

    Ligne 364 de Serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (m_numero == 1 && m_resume.size() != 0)//titre != L"")
    {
    Ok, m_numero est toujours "-1", donc, encore un if pour rien.

    Ligne 377 de Serie.cpp :
    Cool, m_numero passe de -1 à 0, mais comme c'est à la fin de "SequenceVisionnage:: Print()", ça sert à rien !!!

    Alors, si c'est bien ce que vous vouliez faire avec ce champ "m_numero", c'est bien, mais moi, je vois pas l'intérêt de tout ce bordel.
    Il y a un champ "m_numero" par objet/instance de SequenceVisionnage. Il n'est pas commun à tous les objets/instances "SequenceVisionnage", et heureusement.

    Comment faire ?
    Bin, déjà, en ne mettant en commentaire le code que j'ai fourni :
    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
    // ===> Ici !!!
    /*void Episode::Print()
    {
        bool first = true;
        for (auto vis : m_liste_sequence_visionnages)
        {
            if (first)
            {
                PrintFirstSequenceVisionnage(vis);
            }
            else
            {
                PrintSequenceVisionnage(vis);
            }
            first = false;
        }
    }*/
    Vous n'avez qu'à implémenter tranquillement les fonctions "PrintFirstSequenceVisionnage" et "PrintSequenceVisionnage".
    Comme vous ne nous avez pas expliqué quelles différences existent entre l'affichage de la première séquence de visionnage et les suivantes (même s'il y a une différence, c'est pas sûr), on ne peut pas vous aider à les implémenter.
    Ces différences ne sont-elles pas juste l'affichage des informations de l'épisode en plus des informations de la séquence de visionnage ?
    Pouvez-vous nous présentez comment vous voulez que les informations de l'épisode et des informations des séquences de visionnage soient concrètement affichées, SVP ?
    Ainsi, on pourrait vous aiguiller pour l'implémentation de "PrintFirstSequenceVisionnage" et/ou "PrintSequenceVisionnage".

    Excusez-moi !
    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
    InfosVisionnage::InfosVisionnage(const Saison& saison, fs::path const& m_cheminFichier) : m_saison{ saison }
    {
    ...
        std::vector<std::wstring> file_content = lire_fichierTxt(m_cheminFichier.wstring(), { L"\n" }, false);
        m_NumeroEpisode = std::stoi(match[filename_numero_episode_index]);
        if (file_content.size() > 0)
        {
            std::wsmatch soustitre_match;
            const std::wregex soustitre_format_rg{ L"(?:(\\d+)\\.)?(.+)(?:\\s?\\:\\s|/|\\s\\-\\s)(.+)" };
            if (std::regex_match(file_content[0], soustitre_match, soustitre_format_rg))
            {
                m_NumeroEpisode = soustitre_match[1].matched ? std::stoi(soustitre_match[1]) : 0;
                m_titres.push_back(soustitre_match[2]);
                m_titres.push_back(soustitre_match[3]);
            }
            else
            {
                m_titres.push_back(file_content[0]);
            }
        }
    ...
    }
    et pas :
    La phrase : verbre
    Quelle est la question ???
    m_titres[0] contient bien " La phrase " et m_titres[1] contient bien "verbre".
    C'est quoi le problème ??? Les espaces au début et à la fin de m_titres[0] ???

    Je rappelle que le but d'une expression régulière est de reconnaitre un "motif" dans une chaine de caractère et d'isoler les différentes parties du motif dans des "captures".
    "La phrase : verbre" correspond au motif "(.+)(?:\s?\:\s|/|\s\-\s)(.+)"

    Qui peut s'exprimer en :
    - "n'importe quelle chaine de caractère" => (.+)
    Suivi par :
    - soit un espace puis un ":" suivi encore par un espace => \s\:\s
    Mais le premier espace n'est pas obligatoire =>\s?\:\s

    - soit un slash "/" => /

    - soit un espace puis un "-" suivi encore par un espace => \s\-\s

    Le tout suivi par "n'importe quelle chaine de caractère" => (.+)

    Vous devriez donc retrouver ces différentes parties du motif dans l'expression régulière, ces parties sont entourées de parenthèse "()" pour indiquer au moteur d'expression régulière quelles parties de la chaine de caractère récupérer dans les "captures".
    Ici, c'est "soustitre_match" qui contient les différentes captures.
    "soustitre_match[1]" contient la capture correspondant aux chiffres indiquant le numéro de l'épisode.
    "soustitre_match[2]" contient la capture correspondant à la chaine de caractère avant l'un des séparateurs spécifiés.
    "soustitre_match[3]" contient la capture correspondant à la chaine de caractère après l'un des séparateurs spécifiés.

    Faites des tests avec des cas simples avec l'outil à l'URL https://regex101.com pour vous faire la main.

    Que faire ?
    Comprendre comment fonctionne les expressions régulières.

    Ou :
    La phrase: verber
    ou
    La phrase/verber
    ou
    La phrase / verber
    ou
    La phrase - verber
    ou
    La phrase - verber
    Quelle est là question ???
    "La phrase: verber", motif déjà gérer avec : "\s?\:\s"
    "La phrase/verber", motif déjà gérer avec : "/"
    "La phrase / verber", facile à ajouter : "\s/\s"
    "La phrase - verber", motif déjà gérer avec : "\s\-\s"
    "La phrase - verber", quelle différence avec le motif précédent ?

    Donc, pour prendre en compte le nouveau format, rien de plus simple :
    (.+)(?:\s?\:\s|/|\s\-\s|\s/\s)(.+)
    (A vous d'ajouter l'escaping lié au C/C++)
    L'expression serait vraisemblablement simplifiable, mais vous ne nous donnez pas de définition "synthétique" des motifs utilisables dans les noms de fichier et le contenu des fichiers.

    Si vous ne vous en sortez pas avec les expressions régulières, c'est possible de faire la même chose avec vos "std::find", mais il faut le faire correctement, ce que vous ne faisiez pas et le faire correctement demande bien plus de code, peu lisible, et, je trouve, plus compliqué à mettre au point correctement.

    bacelar : 02/07/2024, 15h36
    Je viens de comprendre le "problème" avec le nom de répertoire "Azertyuiop £££.[2024].Mini-série".
    Effectivement, l'expression régulière, que j'ai donné, ne fonctionne pas sur ce nom car elle attends toujours un espace entre la ou les années et le nom du canal de diffusion.
    Ici, ce n'est pas le cas.
    Faut juste rendre cet espace optionnel.
    J'ai aussi mis la formule pouvant récupérer les 2 années avant les autres pour gérer la priorité de capture :
    (.+?)(?:\.\[(\d{4}\-\d{4}\s?|\d{4}\-\s?|\d{4}\s?)?([^\]]*)\])?(?:\.(.+))?
    Marches pas !!!
    Oups, j'ai mal lu le résultat sur https://regex101.com/r/bhCcJO/1
    L'évaluation OK/pas OK est bonne mais le découpage en parties n'est pas bonne.
    https://regex101.com/r/0fqBFb/1
    Donne une version qui découpe les parties plus correctement.

    Mais la formule donnée : "(.+?)(?:\.\[(\d{4}\-\d{4}\s?|\d{4}\-\s?|\d{4}\s?)?([^\]]*)\])?(?:\.(.+))?" n'est pas celles implémentées par le code.
    Elle doit être bonne, mais faut que vous l'utilisiez dans votre code. (ça ne l'ai pas dans la version "Juillet 12 (13/07/2024)" des sources)
    Vérifiez avec https://regex101.com les formules que vous devriez être capable de créer.

    Mais vous devriez avoir une vue synthétique de quoi et comment doit être formés les noms et textes que vous devez analyser. Sinon, les expressions régulières vont se complexifier inutilement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Saison::Saison(fs::path const& cheminFichier, const Serie& serie) : m_serie{ serie }
    {
    ...
        std::wregex filename_pattern{ L"???" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
        ???
    ...
    Avec :
    2021
    2021 abc
    2021-02
    2021-02 abc
    2021-02-30
    2021-02-30 abc

    Ok ou pas !
    Oui, faut juste réfléchir un peu pour trouver la "bonne" expression régulière.

    Démonstration d'une expression régulière qui fait le travail :
    https://regex101.com/r/QQy0ai/1
    réponse rapide : (\d{4})(?:-(\d{2})(?:-(\d{2}))?)?(?:\s(.+))?

    Vous n'arrivez pas à accéder aux sauvegardes des expressions régulières + tests que j'y ai sauvegardé ???

    Star Wars- The Clone Wars.(2008-08-27).Animation
    Faut juste faire on sorte de prendre des parenthèses à la place des crochets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wregex film_pattern{ L"(.+?)(?:\\.\\((\\d{4}\\-\\d{2}\\-\\d{2}\\s)?([^\\)]*)\\))?(?:\\.(.+))?" };
    https://en.cppreference.com/w/cpp/regex : Complexe !!! Alors...
    Normal, c'est pour cela que j'ai indiqué l'outil https://regex101.com

  12. #792
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Ok ! Je suis crevé !
    Mais, Film film : presque !
    Demain ou plus tard

    Merci beaucoup

  13. #793
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    Vous ne pouvez pas lire les posts avec des listes à puces (LIST) ou vous ne pouvez pas répondre "facilement" à ces posts ?
    Des listes à puces (LIST) : il bug !!! (Windows 10 : Paramètres : Options d'ergonomie : Narrateur). Windows 11, peu être ?

    Pouvez-vous résumer en quelques mots ce qu'est une structure en C ?
    Quelles différences entre une structure C et une structure en C++, toujours en quelques mots ?
    Ok = C ! Mais, j'ai oublié ! Alors, C++ : très dure !

    (BIS)
    Vous n'avez pas répondu.
    J'attends une explication succincte du fonctionnement du programme, SVP.
    Ben ! Oh : j'ai oublié (bis) ! Aie !

    Depuis un objet Serie, le champ "saisons" contient l'ensemble des saisons de la serie.
    Depuis un objet Saison, le champ "m_liste_episodes" contient l'ensemble des épisodes de la Saison.
    Depuis un objet Episode, le champ "m_liste_sequence_visionnages" contient l'ensemble des sessions de visionnage de l'épisode.
    Pendant la construction de l'arborescence, on a pris soin de stocker le lien inverse de l'arborescence, pour pouvoir "remonter" l'arborescence.
    Depuis un objet Saison, on obtient la Serie contenant la saison via son champ "m_serie".
    Depuis un objet Episode, on obtient la saison contenant l'épisode via son champ "m_saison".
    Depuis un objet SequenceVisionnage, on obtient l'épisode correspondant à la séquence de visionnage via son champ "m_episode".
    Eh ! Difficile a lire ! Plus simple ! Mais, bon

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void SequenceVisionnage::UneFonctionDeLaClasseSequenceVisionnage(???)
    Pouvez-vous expliquer ?

    (foireuse cette boucle, utilisez plutôt une "range-based for loop")
    Oui ! Comment faire ?

    Saison => Episode
    Ok !

    Episode => Séquence de Visionnage
    Ok ! Comme "range-based for loop" ?

    Tout ceci n'est donc pas "nouveau".
    Si ce n'est toujours pas clair, cette notion d'accès aux informations dans une arborescence d'objet, pouvez-vous poser des cas concrets qui vous posent problème ?
    Ben, alors, ... ???

    Ceux que je vais citer ci-après, c'est des cas un peu "spéciaux".
    ...
    Ainsi, on pourrait vous aiguiller pour l'implémentation de "PrintFirstSequenceVisionnage" et/ou "PrintSequenceVisionnage".
    Rien compris !!!

    Quelle est la question ???
    m_titres[0] contient bien " La phrase " et m_titres[1] contient bien "verbre".
    C'est quoi le problème ??? Les espaces au début et à la fin de m_titres[0] ???

    Je rappelle que le but d'une expression régulière est de reconnaitre un "motif" dans une chaine de caractère et d'isoler les différentes parties du motif dans des "captures".
    Ben, non !

    "La phrase: verber", motif déjà gérer avec : "\s?\:\s"
    "La phrase/verber", motif déjà gérer avec : "/"
    "La phrase / verber", facile à ajouter : "\s/\s"
    "La phrase - verber", motif déjà gérer avec : "\s\-\s"
    "La phrase - verber", quelle différence avec le motif précédent ?
    Ben, non :
    Exemple :
    Phrase
    Ben oui !
    Phrase / verber
    Phrase : titre !
    verbre : sous-titre !
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        const std::wstring d_p = L" : ";
        pos = t[0].find(d_p);
        if (!found && pos != std::wstring::npos)
        {
            m_titres[0] = t[0].substr(0, pos);
            m_titres[1] = d_p;
            m_titres[2] = t[0].substr(pos + 3);
            found = true;
        }
    Voilà !!!


    https://regex101.com : Demain !!!

    Je suis fatigué !!!


    Merci beaucoup

  14. #794
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Juillet 14 (15/07/2024)

    Film : ok !

    Merci

  15. #795
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Peux dormir !

    Exemple :
    The Mandalorian.[2019-2023 Disney+].Mini-série
    2019-11-12
    1x1.2024-06-14.txt
    1. Chapitre 1 : Le Mandalorien
    41 min
    Un chasseur de primes Mandalorien traque une cible pour un mystérieux et fortuné client.
    https://geek.judgehype.com/article/s...e-mandalorian/
    https://www.allocine.fr/series/fiche.../saison-34684/

    Star Wars- The Clone wars.[2008-2020].Animation
    2008
    1x01.2024-06-15.txt
    1. Embuscade
    26 min
    Le maître Jedi Yoda est en mission secrète pour établir un traité avec le roi du système stratégique de Toydaria lorsque le comte Dooku tend une embuscade à son vaisseau. Yoda et trois soldats clones doivent faire face à l'assassin de Dooku, Asajj Ventress, et à son imposante armée de droides, pour prouver que les Jedi sont assez forts pour protéger le roi et son peuple des forces de la guerre...
    https://www.allocine.fr/series/fiche...2/saison-6030/
    https://starwars.fandom.com/fr/wiki/...The_Clone_Wars

    Star Trek - Prodigy.[2021- Netflix].Animation
    2021-10-28
    1x01.2024-01-10.txt
    1. Perdu et trouvé - 1re partie
    23 min
    Prisonnier sur une planète minière, le jeune Dal décide d'aider un fugitif et fait une mystérieuse découverte qui pourrait bien leur permettre de s'échapper.
    1x03.2024-01-12.txt
    3. Un travail d'équipe
    24 min
    La conseillère holographique du Protostar propose de guider le vaisseau, mais la méfiance de Dal envers l'autorité met tout l'équipage en grand danger.
    https://www.allocine.fr/series/fiche...rie=24636.html
    https://www.netflix.com/fr/title/81725736

    Giri$Haji.[2019].Mini-série
    Titre.txt
    Giri/Haji
    60 min
    Aidé par un jeune prostitué nippo-britannique, un détective tokyoïte, Kenzo, ratisse Londres pour retrouver son frère, impliqué avec les Yakuza et recherché pour meurtre.
    2019-10-17
    1x1.2020-01-16_16_17_18.txt
    1. Episode 1
    57 min
    Lorsque le neveu du chef d'un clan Yakuza de Tokyo est tué, un rival part se cacher à l'étranger, plongeant un détective dans un mystère qui le touche de très près.
    https://www.allocine.fr/series/fiche.../saison-35233/
    https://www.netflix.com/fr/title/80190519

    Voilà

  16. #796
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    https://regex101.com/r/0fqBFb/1
    Donne une version qui découpe les parties plus correctement.
    Ok !

    Merci

  17. #797
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    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
    Saison::Saison(fs::path const& cheminFichier, const Serie& serie) : m_serie{ serie }
    {
        auto nomDossier = cheminFichier.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
        assert(nomDossier.length() > 3 && L"Nom de fichier trop court pour avoir au moins une date");
    
        wchar_t sp = L' ', tiret = L'-';
        //std::wregex filename_pattern{ L"(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:\\s(.+))?" };
        std::wregex filename_pattern{ L"(\\d{4})(?:\\-(\\d{2})(?:-(\\d{2}))?)?(?:\\s(.+))?" }; // Ok !
        std::wsmatch match;
        bool found = false;
    
        if (std::regex_match(nomDossier, match, filename_pattern)) // Ok !
        {
            std::wstring year = match[1];
            auto y = std::stoi(year);
            assert(1582 <= y && L"L'année est inférieur !");
    
            // L"(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:\\s(.+))?
            if (match[2].matched) // Marches pas !!!
            {
                std::wstring wstr = match[2].str();
                std::wsmatch dummy;
                if (std::regex_match(wstr, dummy, std::wregex(L"(?:-(\\d{2})(?:-(\\d{2}))?)?(?:\\s(.+))?")))
                {
                    ;
                }
                else
                {
                    ;
                }
    
    
            }
    ...
    }
    Pourquoi ?

    Nom : Capture d’écran 2024-07-16 222640.png
Affichages : 46
Taille : 30,1 Ko

    Merci d'avance

  18. #798
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    https://github.com/laurentbouleau/Exemple : Juillet 17 (17/07/2024) 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
    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
    Saison::Saison(fs::path const& cheminFichier, const Serie& serie) : m_serie{ serie }
    {
        auto nomDossier = cheminFichier.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
        assert(nomDossier.length() > 3 && L"Nom de fichier trop court pour avoir au moins une date");
     
        //std::wregex filename_pattern{ L"(\\d{4})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:\\s(.+))?" };
        std::wregex filename_pattern{ L"(\\d{4})(?:\\-(\\d{2})(?:-(\\d{2}))?)?(?:\\s(.+))?" };
        std::wsmatch match;
        std::tm tm;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring year = match[1];
            auto y = std::stoi(year);
            assert(1582 <= y && L"L'année est inférieur !");
            auto m = 0, d = 0;
            tm.tm_year = y - 1900;
            if (match[2].matched)
            {
                std::wstring mon = match[2];
                auto m = std::stoi(mon);
                assert((1 <= m && m <= 12) && L"Le mois invalide !");
                tm.tm_mon = m - 1;
     
                if (match[3].matched)
                {
                    std::wstring mday = match[3];
                    auto d = std::stoi(mday);
                    assert((1 <= d && d <= 31) && L"Le jour invalide !");
                    if (!checkday(m, d, y))
                    {
                        std::wcout << L"Le jour invalide !!!" << std::endl;
                        exit(1);
                    }
                    tm.tm_mday = d;
                }
            }
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
        if (match[4].matched)
        {
            m_date_diffusee_a_partir_de.second = match[4];
        }
        m_date_diffusee_a_partir_de.first = tm;
    }
    https://github.com/laurentbouleau/Exemple/ : Tracker.[2024-]/
    https://www.allocine.fr/series/fiche.../saison-54037/ ???

    Merci beaucoup

  19. #799
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Nom : Capture d’écran 2024-07-17 223836.png
Affichages : 30
Taille : 25,6 Ko
    ???

    Rrr !!!

    Sinon :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Saison::Saison(fs::path const& cheminFichier, const Serie& serie) : m_serie{ serie }
    {
    ...
    }
    Merci beaucoup

    Mais :
    Plutôt que d'avoir 10 fois la même information à 10 endroits différents, l'objectif est d'avoir l'information "correcte" à un seul endroit, facile d'accès.
    ...
    Ainsi, on pourrait vous aiguiller pour l'implémentation de "PrintFirstSequenceVisionnage" et/ou "PrintSequenceVisionnage".
    Compliqué !
    Pas-à-pas !!!

    Et :
    Quelle est la question ???
    m_titres[0] contient bien " La phrase " et m_titres[1] contient bien "verbre".
    C'est quoi le problème ??? Les espaces au début et à la fin de m_titres[0] ???
    ...
    Mais la formule donnée : "(.+?)(?:\.\[(\d{4}\-\d{4}\s?|\d{4}\-\s?|\d{4}\s?)?([^\]]*)\])?(?:\.(.+))?" n'est pas celles implémentées par le code.
    Elle doit être bonne, mais faut que vous l'utilisiez dans votre code. (ça ne l'ai pas dans la version "Juillet 12 (13/07/2024)" des sources)
    Je suis crevé !!!
    Simple !

    (15/07/2024, 00h05)

  20. #800
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    529
    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 : 529
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    Excusez-moi !

    https://github.com/laurentbouleau/Exemple : Juillet 18 (18/07/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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    ...
    Saison::Saison(fs::path const& cheminFichier, const Serie& serie) : m_serie{ serie }
    {
    ...
    }
    ...
    void Saison::Print_Header()
    {
        wchar_t date_tab[15];
        std::wstring date_str{};
        if (m_date_diffusee_a_partir_de.first.tm_mday == -858993460 && m_date_diffusee_a_partir_de.first.tm_mon == -858993460)
        {
            std::wcsftime(date_tab, 15, L"%Y", &m_date_diffusee_a_partir_de.first);
            std::wstring date_tab_str = date_tab;
            date_str = date_tab_str;
        }
        else if (m_date_diffusee_a_partir_de.first.tm_mday == -858993460)
        {
            std::wcsftime(date_tab, 15, L"%m/%Y", &m_date_diffusee_a_partir_de.first);
            std::wstring date_tab_str = date_tab;
            date_str = date_tab_str.substr(0, 2) + keyColor[1] + L'/' + valuesColor + date_tab_str.substr(3, 4);
        }
        else
        {
            std::wcsftime(date_tab, 15, L"%d/%m/%Y", &m_date_diffusee_a_partir_de.first);
            std::wstring date_tab_str = date_tab;
            date_str = date_tab_str.substr(0, 2) + keyColor[1] + L'/' + valuesColor + date_tab_str.substr(3, 2) + keyColor[1] + L'/' + valuesColor + date_tab_str.substr(6, 4);
        }
        std::wstring dossier_str;
    ...
    }
    ...
    Exemple :
    ===> Star Wars- The Clone wars.[2008-2020].Animation

    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, 16h33
  2. probléme avc console.readline()
    Par dv-2008 dans le forum VB.NET
    Réponses: 7
    Dernier message: 10/03/2008, 00h33
  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, 09h20
  4. Problème avc une requête
    Par Raiga dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 30/06/2007, 18h36
  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, 14h50

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