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. #841
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    628
    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 : 628
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Août 16 (23/08/2024)

    Elfy : Compagnon décédé !
    Alors, Escitalopram. Trop dormis ou pas peux dormis !

    Mais :
    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
    Film::Film(std::filesystem::path racine)
    {
        this->racine = racine;
        auto nomDossier = racine.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
     
        std::wregex filename_pattern{ L"(.+?)(?:\\.\\((\\d{4}\\-\\d{2}\\-\\d{2}\\s?)?([^\\)]*)\\))?(?:\\.(.+))?$" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring titres = match[1];
            m_titres = Dossier_Titres(titres);
     
            if (match[2].matched)
            {
                std::wstring wstr = match[2].str();
                m_date_du_film.tm_year = stoi(wstr) - 1900;
                wstr = wstr.substr(5);
                m_date_du_film.tm_mon = stoi(wstr) - 1;
                wstr = wstr.substr(3);
                m_date_du_film.tm_mday = stoi(wstr);
            }
            m_sur = (match[3].matched) ? match[3].str() : L"";
            m_sous_genre = (match[4].matched) ? match[4].str() : L"";
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
    }
    Voilà !!!

    Après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_titres = Dossier_Titres(titres);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::vector<std::wstring> t = ::extraire_Titres_Depuis_UneLigne(titres);
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abc_Titres(m_titres, titres);
    C'est tout !!!

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

    https://github.com/laurentbouleau/Exemple : Août 17 (23/08/2024)

    film.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            m_titres = Dossier_Titres(titres);
    par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            m_titres = initialiser_Titres(titres);
    Et film_serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    std::vector<std::wstring> initialiser_Titres(std::wstring& titres)
    {
        assert(titres.length() > 0 && L"Nom de titres vide"); // ??? pour Mot de... ?
        const std::vector<std::wstring> t = ::extraire_Titres_Depuis_UneLigne(titres);
        return t;
    }
    Film.cpp : ok !
    Par contre (serie.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
    Serie::Serie(std::filesystem::path racine)
    {
        this->racine = racine;
    ...
        //std::wregex filename_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})?([^\\]]*)\\])?(?:\\.(.+))?" }; // Marches pas !!!
    //    std::wregex filename_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})?([^\\]]*)\\])?(?:\\.(.+))?" };
        std::wregex filename_pattern{ L"^(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})([^\\]]*)\\])(?:\\.(.+))?$|^(.+)(?:\\.(.+))$" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring titres = match[1];
            m_titres = initialiser_Titres(titres);
    ...
            m_sur = (match[3].matched) ? match[3].str() : L"";
            m_sous_genre = (match[4].matched) ? match[4].str() : L"";
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
    }
    Marches pas !!! std::wregex filename_pattern et m_sous_genre ! https://regex101.com/r/dzh1TD/1 ! Tant pis !!! Demain ou plus tard !!!

    Pas fini : extraire_Titres_Depuis_UneLigne et abc_Titre !

    Bonne nuit

  3. #843
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 202
    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 202
    Points : 12 358
    Points
    12 358
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Film::Film(std::filesystem::path racine){...}
    Je suis assez "OK" avec le code.
    On a juste tendance à faire en sorte que les lignes de code soient assez indépendantes les unes des autres.
    Avec votre code, si on modifie un peu le contenu de la variable "filename_pattern", par exemple, en ajoutant des séparateurs optionnels, etc..., il faudra à modifier votre code de décodage de la date.

    Le code que j'ai fourni a aussi des dépendances avec la variable "filename_pattern", mais c'était une base.
    Je pense qu'il est plus facile de rendre le code de décodage de la date indépendant de "filename_pattern" à partir de mon code, qui utilise plus de captures, que du vôtre qui utilise plus d'informations "en dur".

    Dans la classe Film, changement de nom du champ :
    "m_date" => "m_date_du_film"
    Franchement, c'est tout aussi "mauvais".
    On n'a pas plus d'information sur "l'utilité" de ce champ.
    Si c'est ni la date de sortie ("m_date_de_sortie") ni la date de reprise ("m_date_de_reprise"), c'est la date de quoi ("du film") ???

    La variable "date_du_film_str " dans la fonction "Print_Header", Ok, mais on sait toujours pas ce qu'est cette "m_date_du_film".


    "Dossier_Titres" => "initialiser_Titres"
    C'est vrai que "Dossier_Titres", c'est vraiment pas top comme nom, je l'avais déjà indiqué.
    Mais "initialiser_xxx" était réservé aux fonctions qui initialisaient le champ "m_xxx".
    Donc "initialiser_Titres", c'est pas top, car elle n'initialisera pas directement "m_Titres".
    J'avais déjà proposé "extraire_xxx_Depuis_yyyy" pour les fonctions qui récupèrent des informations depuis un "endroit", cf. la fonction "extraire_Titres_Depuis_UneLigne(std::wstring& ligne)".
    Donc, moi, je ne créerai pas une fonction "initialiser_Titres", mais une fonction "extraire_Titres_Depuis_NomDeFichierOuDeRepertoire((std::wstring& nom)".
    Et logiquement "extraire_Titres_Depuis_NomDeFichierOuDeRepertoire" N'utilisera PAS "extraire_Titres_Depuis_UneLigne", car le format est DIFFERANT.
    Récupérez donc l'ancien code de "Film:ossier_Titres" qui utilisait des "std::wstrinf::find" et pas "extraire_Titres_Depuis_UneLigne" pour implémenter la fonction "extraire_Titres_Depuis_NomDeFichierOuDeRepertoire".
    Et faites en sorte que "extraire_Titres_Depuis_NomDeFichierOuDeRepertoire" ne modifie pas le champ "m_titres", mais renvoye un résultat (la fonction extrait les données, elle n'initialise pas un champ).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abc_Titres(m_titres, titres);
    Franchement, c'est un nom complètement abscons.
    Et j'ai déjà fait une proposition de nom et de signature dans un post précédent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> fusionner_Titres(std::vector<std::wstring>& vieux_titres, std::vector<std::wstring>& nouveaux_titres)...
    Et, donc, au lieu d'avoir un code cryptique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    abc_Titres(m_titres, titres);
    On aurait un code bien plus transparent sur ses "intentions" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_titres = fusionner_Titres(m_titres,nouveaux_titres);

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

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

    https://github.com/laurentbouleau/Exemple : Août 18 (24/08/2024)

    film_serie.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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    ...
    std::vector<std::wstring> fusionner_Titres(std::vector<std::wstring>& vieux_titres, std::vector<std::wstring>& nouveaux_titres)
    {
        assert(nouveaux_titres.size() < 4 && L"???");
        assert(vieux_titres.size() < 4 && L"???");
        bool found = false;
        if (nouveaux_titres == vieux_titres)
            found = true;
        else
        {
            if (vieux_titres.size() == nouveaux_titres.size())
            {
                //double titres_ration{ 80.0 };
                if (vieux_titres.size() == 1 && nouveaux_titres.size() == 1)
                {
                    nouveaux_titres = vieux_titres;
                    found = true;
                }
                if (vieux_titres.size() == 3 && nouveaux_titres.size() == 3 && vieux_titres[0] == nouveaux_titres[0] && vieux_titres[1] != nouveaux_titres[1] && vieux_titres[2] == nouveaux_titres[2])
                {
                    nouveaux_titres[1] = vieux_titres[1];
                    found = true;
                }
                if (vieux_titres.size() == 3 && nouveaux_titres.size() == 3 && (vieux_titres[0] != nouveaux_titres[0] || vieux_titres[1] != nouveaux_titres[1] || vieux_titres[2] != nouveaux_titres[2]))
                {
                    nouveaux_titres = vieux_titres;
                    found = true;
                }
            }
        }
        return nouveaux_titres;
    }
    ...
    std::vector<std::wstring> extraire_Titres_Depuis_UneLigne(std::wstring& titre)
    { // Titre 
        assert(titre.length() > 0 && L"Nom de titres vide"); // ??? pour Mot de... ?
        std::wstring& t = titre;
     
        std::vector<std::wstring> titres;
        std::size_t pos = 0;
        bool found = false;
        const std::wstring d_p = L" : ";
        pos = t.find(d_p);
        if (!found && pos != std::wstring::npos)
        {
            titres.push_back(t.substr(0, pos));
            titres.push_back(d_p);
            titres.push_back(t.substr(pos + 3));
            found = true;
        }
        const std::wstring d_p2 = L": ";
        pos = titre.find(d_p2);
        if (!found && pos != std::wstring::npos)
        {
            titres.push_back(t.substr(0, pos));
            titres.push_back(d_p2);
            titres.push_back(t.substr(pos + 2));
            found = true;
        }
        const std::wstring d_p3 = L"/";
        pos = t.find(d_p3);
        if (!found && pos != std::wstring::npos)
        {
            titres.push_back(t.substr(0, pos));
            titres.push_back(d_p3);
            titres.push_back(t.substr(pos + 1));
            found = true;
        }
        const std::wstring d_p4 = L" - ";
        pos = t.find(d_p4);
        if (!found && pos != std::wstring::npos)
        {
            titres.push_back(t.substr(0, pos));
            titres.push_back(d_p4);
            titres.push_back(t.substr(pos + 3));
            found = true;
        }
        const std::wstring d_p5 = L"- ";
        pos = t.find(d_p5);
        if (!found && pos != std::wstring::npos)
        {
            titres.push_back(t.substr(0, pos));
            titres.push_back(d_p5);
            titres.push_back(t.substr(pos + 2));
            found = true;
        }
        if (!found)
        {
            titres.push_back(t);
            found = true;
        }
        return titres;
    }
    ...
    Et film.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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    ...
    void Film::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre)
    { // Titre
        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));
     
        std::vector<std::wstring>nouveaux_titres = extraire_Titres_Depuis_UneLigne(contenu[0]);
     
        m_titres = fusionner_Titres(m_titres, nouveaux_titres);
     
        contenu.erase(contenu.begin());
        if (contenu.size() > 0)
        {
            m_duree = initialiser_Duree(contenu[0]);
            contenu.erase(contenu.begin());
            if (contenu.size() > 0)
                m_resume = contenu;
        }
    }
    ...
    const void Film::Print_Header()
    {
        if (affichage_titres_actif)
        {
            std::wstring titres_str;
            std::wstring date_en_salle_ou_sur_str;
            std::wstring x_sj_str;
            std::wstring sj_str;
            std::wstring duree_str;
            std::wstring note_str;
     
            titres_str = m_keyColor[0] + L"Titre : " + m_valuesColor + m_titres[0];
            if (m_titres.size() > 1)
                titres_str += m_keyColor[1] + m_titres[1] + m_valuesColor + m_titres[2];
            // Date du film
            if (affichage_date_en_salle_ou_sur_actif)
            {
                wchar_t date_string[15];
                wcsftime(date_string, 15, L"%d/%m/%Y", &m_date_en_salle_ou_sur);
                date_en_salle_ou_sur_str = date_string;
                date_en_salle_ou_sur_str = m_keyColor[0] + L" (" + m_valuesColor +
                    date_en_salle_ou_sur_str.substr(0, 2) + m_keyColor[0] + L'/' + m_valuesColor +
                    date_en_salle_ou_sur_str.substr(3, 2) + m_keyColor[0] + L'/' + m_valuesColor +
                    date_en_salle_ou_sur_str.substr(6, 4); //+ m_valuesColor;
                if (affichage_sur_actif && m_sur == L"")
                {
                    date_en_salle_ou_sur_str += m_keyColor[1] + L" en salle" + m_valuesColor;
                }
                else if (affichage_sur_actif && (m_sur == L"Disney+" || m_sur == L"Netflix"))
                {
                    date_en_salle_ou_sur_str += m_keyColor[1] + L" sur " + m_valuesColor;
                    if (m_sur == L"Disney+")
                    {
                        date_en_salle_ou_sur_str += L"Disney+ " + m_keyColor[1] + L": " + m_valuesColor + m_disney_sj;
                    }
                    else
                    {
                        date_en_salle_ou_sur_str += L"Netflix " + m_keyColor[1] + L": " + m_valuesColor + m_netflix_sj;
                    }
                }
                else 
                {
                    date_en_salle_ou_sur_str += m_sur;
                }
                date_en_salle_ou_sur_str += m_keyColor[0] + L')' + m_valuesColor;
            }
            // x signalétique jeunesse
            if (affichage_x_sj_actif && m_sur == L"")
            {
                // Disney+ SJ
                if (affichage_disney_sj_actif && m_disney_sj.length() != 0)
                    x_sj_str += m_keyColor[0] + L" (" + m_valuesColor + L"Disney+" + m_keyColor[1] + L" : " + m_valuesColor + m_disney_sj + m_keyColor[0] + L')' + m_valuesColor;
                // Netflix SJ
                if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0)
                    x_sj_str += m_keyColor[0] + L" (" + m_valuesColor + L"Netflix" + m_keyColor[1] + L" : " + m_valuesColor + m_netflix_sj + m_keyColor[0] + L')' + m_valuesColor;
            }
            // La signalétique jeunesse
            if (affichage_sj_actif && m_sj.length() != 0)
                sj_str += m_keyColor[0] + L" (" + m_valuesColor + L"SJ" + m_keyColor[1] + L" : " + m_valuesColor + m_sj + m_keyColor[0] + L')' + m_valuesColor;
            // Durée
            if (affichage_duree_actif)
            {
                duree_str = L' ' + std::to_wstring(m_duree / (60 * 60)) + m_keyColor[0] + L"h" + m_valuesColor + L' ' + std::to_wstring((m_duree - ((m_duree / (60 * 60)) * 60 * 60)) / 60) + m_keyColor[0] + L"min " + m_valuesColor;
            }
            // Note
            if (affichage_note_actif)
                note_str += Print_Note();
     
            std::wcout << titres_str << date_en_salle_ou_sur_str << x_sj_str << sj_str << duree_str << note_str << std::endl;
        }
    }
    ...
    Avec votre code, si on modifie un peu le contenu de la variable "filename_pattern", par exemple, en ajoutant des séparateurs optionnels, etc..., l faudra à modifier votre code de décodage de la date.
    Expliquez-moi !
    Le code que j'ai fourni a aussi des dépendances avec la variable "filename_pattern", mais c'était une base.
    Je pense qu'il est plus facile de rendre le code de décodage de la date indépendant de "filename_pattern" à partir de mon code, qui utilise plus de captures, que du vôtre qui utilise plus d'informations "en dur".
    Que faire ?

    serie.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
    Serie::Serie(std::filesystem::path racine)
    {
        this->racine = racine;
        auto nomDossier = racine.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
    
        //std::wregex filename_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})?([^\\]]*)\\])?(?:\\.(.+))?" }; // Marches pas !!!
    //    std::wregex filename_pattern{ L"(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})?([^\\]]*)\\])?(?:\\.(.+))?" };
        std::wregex filename_pattern{ L"^(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})([^\\]]*)\\])(?:\\.(.+))?$|^(.+)(?:\\.(.+))$" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring titres = match[1];
            m_titres = initialiser_Titres(titres);
            if (match[2].matched)
            {
                std::wstring annees_str = match[2].str();
                std::wsmatch dummy;
                if (std::regex_match(annees_str, dummy, std::wregex(L"\\d{4}\\-\\d{4}\\s?")))
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                    m_f_anneesProduction.second = stoi(annees_str.substr(5));
                }
                else
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                }
            }
    
            m_sur = (match[3].matched) ? match[3].str() : L"";
            m_sous_genre = (match[4].matched) ? match[4].str() : L"";
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
    }
    Etc..
    Marches pas !!!

    Je suis crevé !

    Merci vraiment

  6. #846
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    628
    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 : 628
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Août 19 (25/08/2024)

    Et :
    https://github.com/laurentbouleau/Ex...7%5D.Animation : Star Wars Rebels.[2014-2017].Animation : Hors saison (11 août 2014 : exemple 0x1.2024-08-21.txt)

    Merci

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

    Peux dormi ! Je suis fatigué !

    https://github.com/laurentbouleau/Exemple : Août 20 (25/08/2024)

    serie.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
    ...
    void Serie::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre)
    { // Titre
        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));
     
        std::vector<std::wstring>nouveaux_titres = extraire_Titres_Depuis_UneLigne(contenu[0]);
     
        m_titres = fusionner_Titres(m_titres, nouveaux_titres);
        contenu.erase(contenu.begin());
        if (contenu.size() > 0)
        {
            initialiser_Duree(contenu[0]);
            contenu.erase(contenu.begin());
            if (contenu.size() > 0)
                m_resume = contenu;
        }
    }
    ...
    Ok !

    film.cpp et serie.cpp :
    Pas de extern ...
    Ok ou pas ok ?

    Mais :
    Kaleidoscope.[2023 Netflix]
    Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga
    SupraCell.[2024 Netflix].Mini-série
    Azertyuiop £££.[2024].Mini-série
    Marche pas !

    Et :
    Star Wars- The Clone wars.[2008-2020].Animation
    Seven Deadly Sins- Four Knights of the Apocalypse.[2023].Manga
    Dr. STONE.[2019-2022 Crunchyroll].Manga
    Andor.[2022- Disney+]
    Star Wars Rebels.[2014-2017].Animation
    Ok !

    Peux être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_sous_genre = (match[4].matched) ? match[4].str() : L"";
    ???
    et/ou :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        std::wregex filename_pattern{ L"^(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})([^\\]]*)\\])(?:\\.(.+))?$|^(.+)(?:\\.(.+))$" };
    ???

    Par contre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                std::wstring annees_str = match[2].str();
                std::wsmatch dummy;
                if (std::regex_match(annees_str, dummy, std::wregex(L"\\d{4}\\-\\d{4}\\s?")))
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                    m_f_anneesProduction.second = stoi(annees_str.substr(5));
                }
                else
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                }
    ???

    Exemple serie.cpp :
    abc.[2008]
    ou
    abc.[2008-]
    ou
    abc.[2008-2010]
    Meilleur !!! Ok ou pas !

    Aller : le film : Star Wars - Episode VII - Le réveil de la force.(2015-12-16)
    Après : dormir ! Crevé !

    Merci d'avance

  8. #848
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    628
    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 : 628
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Août 21 (25/08/2024)

    serie.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
    ...
    const void Serie::Print_Header()
    {
        if (affichage_titres_actif)
        {
            std::wstring titres_str;
            std::wstring annees_str;
            std::wstring sur_str;
            std::wstring x_sj_str;
            std::wstring sj_str;
            std::wstring duree_str;
            std::wstring note_str;
    
            titres_str = m_keyColor[0] + L"Titre : " + m_valuesColor + m_titres[0];
            if (m_titres.size() > 1)
                titres_str += m_keyColor[1] + m_titres[1] + m_valuesColor + m_titres[2];
            // Année(s)
            if (affichage_annees_actif)
            {
                annees_str = format_Annees(); // L" [" et L']' ???
            }
            // sur
            if (affichage_sur_actif)
            {
                if (m_sur == L"Disney+" || m_sur == L"Netflix")
                {
                    sur_str += m_keyColor[0] + L" [" + m_valuesColor + m_keyColor[1] + L"sur " + m_valuesColor;
                    if (m_sur == L"Disney+")
                    {
                        sur_str += L"Disney+ " + m_keyColor[1] + L": " + m_valuesColor + m_disney_sj;
                    }
                    else
                    {
                        sur_str += L"Netflix " + m_keyColor[1] + L": " + m_valuesColor + m_netflix_sj;
                    }
                    sur_str += m_keyColor[0] + L']' + m_valuesColor;
                }
                else
                {
                    sur_str += m_keyColor[0] + L" [" + m_valuesColor + m_keyColor[1] + L"sur " + m_valuesColor + m_sur + m_keyColor[0] + L']' + m_valuesColor;
                }
            }
            // x signalétique jeunesse
            if (affichage_x_sj_actif && m_sur == L"")
            {
                // Disney+ SJ
                if (affichage_disney_sj_actif && m_disney_sj.length() != 0)
                    x_sj_str += m_keyColor[0] + L" (" + m_valuesColor + L"Disney+" + m_keyColor[1] + L" : " + m_valuesColor + m_disney_sj + m_keyColor[0] + L')' + m_valuesColor;
                // Netflix SJ
                if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0)
                    x_sj_str += m_keyColor[0] + L" (" + m_valuesColor + L"Netflix" + m_keyColor[1] + L" : " + m_valuesColor + m_netflix_sj + m_keyColor[0] + L')' + m_valuesColor;
            }
            // La signalétique jeunesse
            if (affichage_sj_actif && m_sj.length() != 0)
                sj_str += m_keyColor[0] + L" (" + m_valuesColor + L"SJ" + m_keyColor[1] + L" : " + m_valuesColor + m_sj + m_keyColor[0] + L')' + m_valuesColor;
            // Durée
            if (affichage_duree_actif)
            {
                duree_str = L' ' + std::to_wstring(m_duree/60) + m_keyColor[0] + L"min " + m_valuesColor;
            }
            // Note
            if (affichage_note_actif)
                note_str += calcul_Note_Affichage();
    
            std::wcout << titres_str << annees_str << sur_str << x_sj_str << sj_str << duree_str << note_str << std::endl;
        }
    }
    ...
    Expliquez-moi !

    Et (J'ai oublié !) serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
                if (std::regex_match(annees_str, dummy, std::wregex(L"\\d{4}\\-\\d{4}\\s?")))
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                    m_f_anneesProduction.second = stoi(annees_str.substr(5));
                }
                else
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                }
    ...
    Voilà !!!

    Merci

  9. #849
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 202
    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 202
    Points : 12 358
    Points
    12 358
    Par défaut
    Citation Envoyé par Laurent_B_ Voir le message
    Les expressions régulières pour le décodage des informations dans les noms de fichiers et de répertoire fonctionnent très bien avec "Andor.[2022- Disney+]".

    Pièce jointe 658596
    EDIT:
    Nom : developpez9.png
Affichages : 64
Taille : 44,0 Ko
    Comme le montre le débugueur, c'est le contenu du fichier "./Andor.[2022- Disney+]\2022-09-21\1x06.2024-06-27.txt", et en particulier, sa 2 ligne qui pose problème:

    6. L'œil
    54 min____
    Profitant d'un incroyable festival local, la mission sur Aldhani arrive à son point de non-retour.
    Il y a une tabulation horizontale (\t) après le "min" de la 2ème ligne.
    Il faut juste un peu modifier l'expression régulière pour qu'elle gère le "nouveau" format :

    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 InfosVisionnage::initialiser_Duree(std::wstring& m)
    {
        const std::wregex duree_format_rg{ L"([[:digit:]]+)\\s?(min|MIN|Min)\\s*" };
    
        std::wsmatch match;
    
        if (std::regex_match(m, match, duree_format_rg))
        {
            auto duree_en_minute = std::stoi(match[1]);
            m_duree = duree_en_minute * 60;
        }
        else
        {
            throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide.");
        }
    }
    Mais vous devriez penser à étendre cette fonction pour gère les formats mentionnant des heures, en plus des minutes (voire les secondes et les frames).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> fusionner_Titres(std::vector<std::wstring>& vieux_titres, std::vector<std::wstring>& nouveaux_titres){...}
    Dans votre implémentation, vous modifiez le contenu de "nouveaux_titres" alors que le nom de la fonction ne l'indique pas : c'est un effet de bord.
    Il faut au maximum éviter les effets de bord pour que votre code reste lisible et maintenable.
    Pour renforcer la "sécurité", je change légèrement le type des paramètres pour que mal implémenter cette fonction soit plus compliqué. (rendre les paramètres "const").

    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
    std::vector<std::wstring> fusionner_Titres(const std::vector<std::wstring>& vieux_titres, const std::vector<std::wstring>& nouveaux_titres)
    {
        assert(nouveaux_titres.size() < 4 && L"???");
        assert(vieux_titres.size() < 4 && L"???");
    
        std::vector<std::wstring> resultat = nouveaux_titres;
    
        if (vieux_titres.size() == nouveaux_titres.size())
        {
            //double titres_ration{ 80.0 };
            if (vieux_titres.size() == 1 && nouveaux_titres.size() == 1)
            {
                resultat = vieux_titres;
            }
            if (vieux_titres.size() == 3 && nouveaux_titres.size() == 3 && vieux_titres[0] == nouveaux_titres[0] && vieux_titres[1] != nouveaux_titres[1] && vieux_titres[2] == nouveaux_titres[2])
            {
                resultat[1] = vieux_titres[1];
            }
            if (vieux_titres.size() == 3 && nouveaux_titres.size() == 3 && (vieux_titres[0] != nouveaux_titres[0] || vieux_titres[1] != nouveaux_titres[1] || vieux_titres[2] != nouveaux_titres[2]))
            {
                resultat = vieux_titres;
            }
        }
        
        return resultat;
    
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> extraire_Titres_Depuis_UneLigne(std::wstring& titre){...}
    Le nom du paramètre est vraiment pas terrible.
    "ligne", ça serait bien plus clair.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Film::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre){...}
    A quoi sert le paramètre "m_titre" (en plus d'avoir ce putain de "m_" en préfixe ) ?
    On dégage ce paramètre, SVP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const void Film::Print_Header(){...}
    Il sert à quoi ce const devant ???
    C'est quoi un "const void" ?
    C'est pas plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Film::Print() const
    ???
    Il faudra aussi corriger de la même manière toutes les fonctions appelées par ces fonction "const" pour qu'elles deviennent elles aussi "const".

    const void Film:rint_Header() const
    {...
    m_date_en_salle_ou_sur
    ...
    }
    "m_date_en_salle_ou_sur", c'est mieux que "m_date".
    Mais j'ai du mal a voir la différence entre le champ "m_date_en_salle_ou_sur" et le champ "m_date_de_sortie".

    Avec votre code, si on modifie un peu le contenu de la variable "filename_pattern", par exemple, en ajoutant des séparateurs optionnels, etc..., il faudra à modifier votre code de décodage de la date.
    Expliquez-moi !
    Le code que j'ai fourni a aussi des dépendances avec la variable "filename_pattern", mais c'était une base.
    Je pense qu'il est plus facile de rendre le code de décodage de la date indépendant de "filename_pattern" à partir de mon code, qui utilise plus de captures, que du vôtre qui utilise plus d'informations "en dur".
    Que faire ?
    J'ai l'habitude de faire le code le plus générique possible tant que cela est "gratuit", en termes de complexité et de lisibilité de code.
    Si ce n'est pas "gratuit", on peut tomber dans ce qu'on appelle souvent l'"over-engineering" : faire un code très complexe pour gérer des cas qui n'arriveront pas "dans la vraie vie".
    "Que faire ?" : bin, utiliser le code que j'ai posté à la place du vôtre, non ???
    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
    Film::Film(std::filesystem::path racine)
    {
        this->racine = racine;
        auto nomDossier = racine.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
     
        std::wregex filename_pattern{ L"(.+?)(?:\\.\\((?:(\\d{4})\\-(\\d{2})\\-(\\d{2})\\)))?(?:\\.(.+))?$" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring part_1 = match[1];
            m_titres = extraire_Titres_Depuis_NomDeFichierOuDeRepertoire(part_1);
            if (match[2].matched)
            {
                std::wstring annees_str = match[2].str();
                std::wstring mois_str = match[3].str();
                std::wstring jours_str = match[4].str();
                m_date.tm_year = stoi(annees_str) - 1900;  //beurk!!
                m_date.tm_mon = stoi(mois_str) - 1;           //beurk!!
                m_date.tm_mday = stoi(jours_str);
            }
     
            //m_sur = (match[3].matched) ? match[3].str() : L"";
     
            m_sous_genre = (match[5].matched) ? match[5].str() : L"";
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serie::Serie(std::filesystem::path racine){...}
    Etc..
    Marches pas !!!
    Heu, avec quoi comme série, ça marche pas, SVP ???

    Avec :
    "Star Wars- The Clone wars.[2008-2020].Animation"
    "Seven Deadly Sins- Four Knights of the Apocalypse.[2023].Manga"
    "Andor.[2022- Disney+]"

    Ca fonctionne.

    https://github.com/laurentbouleau/Ex...7%5D.Animation : Star Wars Rebels.[2014-2017].Animation : Hors saison (11 août 2014 : exemple 0x1.2024-08-21.txt)
    Quel est le problème ?
    A part que vos méthodes "Episode:: PrintFirstSequenceVisionnage" et "Episode:: PrintSequenceVisionnage", ce qui explique pourquoi seul les informations sur la saison sont affichées.

    Pourquoi les informations sur la saison sont foireuses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (int j = std::stoi(nomFichier))
            {
                m_numero = j;
                initialiser_Resume(cheminFichier);
                return;
            }
    Pouvez-vous m'expliquer la logique de l'extrait de code précédent, qui fait partie de la fonction "Saison::initialiser_Fichier" ???
    Et "Saison::initialiser_Fichier" a encore un nom foireux car cela ne correspond en rien à ce que la fonction fait réellement.
    Avec ce code, votre saison "Hors Saison" a un champ "m_numero" égale à 4 et votre saison "1" a un champ "m_numero" égale à 15.
    C'est quoi ce raisonnement ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Serie::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre){...}
    Même connerie que dans "Film::initialiser_Titre", dégagez le paramètre "m_titre"
    "Serie::initialiser_Titre" et "Film::initialiser_Titre" devraient être pratiquement identiques. Pensez à fusionner ce code.

    film.cpp et serie.cpp :
    Pas de extern ...
    Ok ou pas ok ?
    Vous devez comprendre à quoi servent les fichiers d'en-tête (.h).

    On va prendre la ligne suivante :
    "extern const std::wstring lire_fichierTxt(std::wstring const& nomFichier);"
    Vous m'avez collé cette ligne dans :
    film.cpp
    serie.cpp
    film_serie.cpp

    Alors que vous n'avez qu'à la mettre UNE fois (sans l'"extern") dans "film_serie.h".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wstring lire_fichierTxt(std::wstring const& nomFichier);
    Vous faites la même chose pour toutes les fonctions qui sont définies dans "film_serie.cpp".

    Et vous remplacez ces dizaines de lignes à la con dans les 3 fichier .cpp par un simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #include "film_serie.h"
    Mais :
    Kaleidoscope.[2023 Netflix]
    Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga
    SupraCell.[2024 Netflix].Mini-série
    Azertyuiop £££.[2024].Mini-série
    Marche pas !
    "Kaleidoscope.[2023 Netflix]", ça plante sur le traitement du fichier ".\Kaleidoscope.[2023 Netflix]\2023-01-01\1x8.2024-03-03.txt" qui est vide.
    Dans votre fonction "lire_fichierTxt" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (contenuFichier == u8"")
    {
        //throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        return { L"" };
    }
    Donc, pour un fichier vide, vous renvoyez un std::vector de taille 1 dont le premier et seule élément est une chaine vide.

    Mais dans votre fonction "InfosVisionnage::InfosVisionnage":
    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
        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 /* && file_content[0] != L""*/)
        {
           std::size_t pos;
            if (m_NumeroEpisode != 0)
            {
                pos = file_content[0].find(L". ");
                file_content[0] = file_content[0].substr(pos + 2);
            }
            //std::size_t pos = file_content[0].find(c_separateur_numero_titre_dans_ligne_de_fichier);
            //auto ligne_titres = (pos != std::wstring::npos) ? file_content[0].substr(pos + c_separateur_numero_titre_dans_ligne_de_fichier.length()) : L"";
            //m_titres = ::extraire_Titres_Depuis_UneLigne(ligne_titres);
     
            m_titres = ::extraire_Titres_Depuis_UneLigne(file_content[0]);
        }
    Dans ce cas, l'expression "file_content.size() > 0" est vraie.
    L'expression 'file_content[0] != L""' est en commentaire.
    "m_NumeroEpisode " est égale à 8, c'est correct.
    "pos = file_content[0].find(L". ");" => pos est égale à std::npos (-1).
    "pos + 2" est égale à 1.
    "file_content[0].substr(1)" renvoie une erreur car "file_content[0]" n'est "long" que de 0 caractère, donc 1, c'est trop loin.

    Vous gérez donc très mal les valeurs de retour des fonctions "find" et/ou "lire_fichierTxt".

    Pour "Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga", même problème que pour "Kaleidoscope.[2023 Netflix]", le fichier ".\Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga\2021-11-02\1x1.2024-03-22_.txt"

    Pour "SupraCell.[2024 Netflix].Mini-série", où est le problème ? (C'est aussi pourri que pour "Star Wars Rebels.[2014-2017].Animation")

    Pour "Azertyuiop £££.[2024].Mini-série", où est le problème ? (C'est aussi pourri que pour "Star Wars Rebels.[2014-2017].Animation")

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_sous_genre = (match[4].matched) ? match[4].str() : L"";
    ???
    Quelle est la question ? C'est quoi le rapport ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wregex filename_pattern{ L"^(.+?)(?:\\.\\[(\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\d{4}|\\d{4}\\-\\s|\\d{4}\\s|\\d{4})([^\\]]*)\\])(?:\\.(.+))?$|^(.+)(?:\\.(.+))$" };
    ???
    Quelle est la question ? C'est quoi le rapport ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
                std::wstring annees_str = match[2].str();
                std::wsmatch dummy;
                if (std::regex_match(annees_str, dummy, std::wregex(L"\\d{4}\\-\\d{4}\\s?")))
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                    m_f_anneesProduction.second = stoi(annees_str.substr(5));
                }
                else
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                }
    ???
    Quelle est la question ?

    Exemple serie.cpp :
    abc.[2008]
    ou
    abc.[2008-]
    ou
    abc.[2008-2010]
    Meilleur !!! Ok ou pas !
    Quelle est la question ?

    Aller : le film : Star Wars - Episode VII - Le réveil de la force.(2015-12-16)
    Les fichiers correspondants ne sont pas dans le dépôt Github.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    annees_str = format_Annees(); // L" [" et L']' ???
    Je comprends pas trop votre problème.
    On demande juste à une fonction, ici "Serie::format_Annees", de générer une chaine de caractères, ici la fonction retourne les Années (soit les années de production ou les années de diffusion en fonction des données disponibles) avec le formatage qui y correspond : couleur + les [].

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

  11. #851
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    628
    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 : 628
    Points : 0
    Points
    0
    Par défaut
    Les expressions régulières pour le décodage des informations dans les noms de fichiers et de répertoire fonctionnent très bien avec "Andor.[2022- Disney+]".
    cf : film_serie.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const std::vector<std::wstring> Sur
    {
        L"Apple TV+",
        L"Amazon Prime Video",
        L"Crunchyroll",
        L"Disney+",
        L"DVD",
        L"Netflix",
        L"SⱯLTO",
        L"VOD"
    };
    Pourquoi ?

    Pièce jointe 658596
    Marches pas !

    Comme le montre le débugueur, c'est le contenu du fichier "./Andor.[2022- Disney+]\2022-09-21\1x06.2024-06-27.txt", et en particulier, sa 2 ligne qui pose problème:
    Ok ! Merci !

    Il faut juste un peu modifier l'expression régulière pour qu'elle gère le "nouveau" format :
    Pas compris !!!

    Mais vous devriez penser à étendre cette fonction pour gère les formats mentionnant des heures, en plus des minutes (voire les secondes et les frames).
    Ah ! Bon ! Mince !

    Dans votre implémentation, vous modifiez le contenu de "nouveaux_titres" alors que le nom de la fonction ne l'indique pas : c'est un effet de bord.
    Il faut au maximum éviter les effets de bord pour que votre code reste lisible et maintenable.
    Pour renforcer la "sécurité", je change légèrement le type des paramètres pour que mal implémenter cette fonction soit plus compliqué. (rendre les paramètres "const").
    Ok !

    Le nom du paramètre est vraiment pas terrible.
    "ligne", ça serait bien plus clair.
    Ok !

    A quoi sert le paramètre "m_titre" (en plus d'avoir ce putain de "m_" en préfixe ) ?
    On dégage ce paramètre, SVP.
    Ok !

    Il faudra aussi corriger de la même manière toutes les fonctions appelées par ces fonction "const" pour qu'elles deviennent elles aussi "const".
    Ok !

    J'ai l'habitude de faire le code le plus générique possible tant que cela est "gratuit", en termes de complexité et de lisibilité de code.
    Si ce n'est pas "gratuit", on peut tomber dans ce qu'on appelle souvent l'"over-engineering" : faire un code très complexe pour gérer des cas qui n'arriveront pas "dans la vraie vie".
    Ok !

    "Que faire ?" : bin, utiliser le code que j'ai posté à la place du vôtre, non ???
    Attention : m_sur !!!

    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
    Film::Film(std::filesystem::path racine)
    {
        this->racine = racine;
        auto nomDossier = racine.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
     
        std::wregex filename_pattern{ L"(.+?)(?:\\.\\((?:(\\d{4})\\-(\\d{2})\\-(\\d{2})\\)))?(?:\\.(.+))?$" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring part_1 = match[1];
            m_titres = extraire_Titres_Depuis_NomDeFichierOuDeRepertoire(part_1);
            if (match[2].matched)
            {
                std::wstring annees_str = match[2].str();
                std::wstring mois_str = match[3].str();
                std::wstring jours_str = match[4].str();
                m_date.tm_year = stoi(annees_str) - 1900;  //beurk!!
                m_date.tm_mon = stoi(mois_str) - 1;           //beurk!!
                m_date.tm_mday = stoi(jours_str);
            }
     
            m_sur = (match[5].matched) ? match[5].str() : L"";
     
            m_sous_genre = (match[6].matched) ? match[6].str() : L"";
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
    }
    Avant : cf film_serie.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::vector<std::wstring> Sur
    {
    ...
    };
    Heu, avec quoi comme série, ça marche pas, SVP ???

    Avec :
    "Star Wars- The Clone wars.[2008-2020].Animation"
    "Seven Deadly Sins- Four Knights of the Apocalypse.[2023].Manga"
    "Andor.[2022- Disney+]"

    Ca fonctionne.
    Pardon ?

    Quel est le problème ?
    A part que vos méthodes "Episode:rintFirstSequenceVisionnage" et "PrintSequenceVisionnage", ce qui explique pourquoi seul les informations sur la saison sont affichées.
    Pas compris !

    Pourquoi les informations sur la saison sont foireuses :
    J'ai oublié !!!

    Pouvez-vous m'expliquer la logique de l'extrait de code précédent, qui fait partie de la fonction "Saison::initialiser_Fichier" ???
    Et "Saison::initialiser_Fichier" a encore un nom foireux car cela ne correspond en rien à ce que la fonction fait réellement.
    Avec ce code, votre saison "Hors Saison" a un champ "m_numero" égale à 4 et votre saison "1" a un champ "m_numero" égale à 15.
    C'est quoi ce raisonnement ?
    Ben...

    Même connerie que dans "Film::initialiser_Titre", dégagez le paramètre "m_titre"
    "Serie::initialiser_Titre" et "Film::initialiser_Titre" devraient être pratiquement identiques. Pensez à fusionner ce code.
    Demain ou plus tard !

    Vous devez comprendre à quoi servent les fichiers d'en-tête (.h).

    On va prendre la ligne suivante :
    "extern const std::wstring lire_fichierTxt(std::wstring const& nomFichier);"
    Vous m'avez collé cette ligne dans :
    film.cpp
    serie.cpp
    film_serie.cpp

    Alors que vous n'avez qu'à la mettre UNE fois (sans l'"extern") dans "film_serie.h".
    Je suis fatigué !!!
    Bon nuit

  12. #852
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    628
    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 : 628
    Points : 0
    Points
    0
    Par défaut
    Ah oui :
    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
    void Serie::corriger_Annee_Debut() const
    {
        assert((m_f_anneesProduction.first || (saisons.size() > 0 && saisons[0].m_f_anneesDiffusion)) && L"Il faut au moins une date de début.");
    
        if (!m_f_anneesProduction.first || (saisons.size() > 0 && saisons[0].m_f_anneesDiffusion && m_f_anneesProduction.first > saisons[0].m_f_anneesDiffusion))
            m_f_anneesProduction.first = saisons[0].m_f_anneesDiffusion;
    }
    ...
    void Serie::corriger_Annee_Fin() const
    {
        assert((m_f_anneesProduction.first || (saisons.size() > 0 && saisons.back().m_f_anneesDiffusion)) && L"Il faut au moins une date de fin.");
    
        if (!m_f_anneesProduction.first || (saisons.size() > 0 && saisons.back().m_f_anneesDiffusion && m_f_anneesProduction.first > saisons.back().m_f_anneesDiffusion))
            m_f_anneesProduction.first = saisons[0].m_f_anneesDiffusion;
    }
    Marches pas !!!

    Merci

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

    Quel est le problème ?
    A part que vos méthodes "Episode:rintFirstSequenceVisionnage" et "PrintSequenceVisionnage", ce qui explique pourquoi seul les informations sur la saison sont affichées.

    Pourquoi les informations sur la saison sont foireuses :
    J'en sais rien !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (int j = std::stoi(nomFichier))
            {
                m_numero = j;
                initialiser_Resume(cheminFichier);
                return;
            }
    Pas compris !

    Pouvez-vous m'expliquer la logique de l'extrait de code précédent, qui fait partie de la fonction "Saison::initialiser_Fichier" ???
    Et "Saison::initialiser_Fichier" a encore un nom foireux car cela ne correspond en rien à ce que la fonction fait réellement.
    Avec ce code, votre saison "Hors Saison" a un champ "m_numero" égale à 4 et votre saison "1" a un champ "m_numero" égale à 15.
    C'est quoi ce raisonnement ?
    J'en sais rien ! J'ai oublié !!!

    "Serie::initialiser_Titre" et "Film::initialiser_Titre" devraient être pratiquement identiques. Pensez à fusionner ce code.
    Comment faire ? ===> film_serie.cpp) : void initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& titre) ???
    A Propos :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void initialiser_Titre_Original(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre_original)
    { // Titre Original
        auto nomFichier = cheminFichier.wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        std::wstring titre = lire_fichierTxt(cheminFichier.wstring());
        assert((titre.size() != 0));
     
        m_titre_original = ::extraire_Titres_Depuis_UneLigne(titre);
    }
    Par :
    std::vector<std:wstring> initialiser_Titre_Original(fs::path const& cheminFichier, std::vector<std::wstring>& titre_original)
    { // Titre Original
    auto nomFichier = cheminFichier.wstring();
    assert(nomFichier.length() > 0 && L"Nom de fichier vide");
    std::wstring titre = lire_fichierTxt(cheminFichier.wstring());
    assert((titre.size() != 0));

    return titre_original = ::extraire_Titres_Depuis_UneLigne(titre);
    }[/CODE]
    ???

    Vous devez comprendre à quoi servent les fichiers d'en-tête (.h).

    On va prendre la ligne suivante :
    "extern const std::wstring lire_fichierTxt(std::wstring const& nomFichier);"
    Vous m'avez collé cette ligne dans :
    film.cpp
    serie.cpp
    film_serie.cpp

    Alors que vous n'avez qu'à la mettre UNE fois (sans l'"extern") dans "film_serie.h".
    ...
    Vous faites la même chose pour toutes les fonctions qui sont définies dans "film_serie.cpp".

    Et vous remplacez ces dizaines de lignes à la con dans les 3 fichier .cpp par un simple :
    Comment faire ???

    ---------------------------------
    "Kaleidoscope.[2023 Netflix]", ça plante sur le traitement du fichier ".\Kaleidoscope.[2023 Netflix]\2023-01-01\1x8.2024-03-03.txt" qui est vide.
    Dans votre fonction "lire_fichierTxt" :
    ...

    Donc, pour un fichier vide, vous renvoyez un std::vector de taille 1 dont le premier et seule élément est une chaine vide.

    Mais dans votre fonction "InfosVisionnage::InfosVisionnage":
    ...
    Dans ce cas, l'expression "file_content.size() > 0" est vraie.
    L'expression 'file_content[0] != L""' est en commentaire.
    "m_NumeroEpisode " est égale à 8, c'est correct.
    "pos = file_content[0].find(L". ");" => pos est égale à std::npos (-1).
    "pos + 2" est égale à 1.
    "file_content[0].substr(1)" renvoie une erreur car "file_content[0]" n'est "long" que de 0 caractère, donc 1, c'est trop loin.

    Vous gérez donc très mal les valeurs de retour des fonctions "find" et/ou "lire_fichierTxt".

    Pour "Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga", même problème que pour "Kaleidoscope.[2023 Netflix]", le fichier ".\Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga\2021-11-02\1x1.2024-03-22_.txt"

    Pour "SupraCell.[2024 Netflix].Mini-série", où est le problème ? (C'est aussi pourri que pour "Star Wars Rebels.[2014-2017].Animation")

    Pour "Azertyuiop £££.[2024].Mini-série", où est le problème ? (C'est aussi pourri que pour "Star Wars Rebels.[2014-2017].Animation")
    Ah ! Mince ! Alors, expliquez-moi ???

    ----------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
                std::wstring annees_str = match[2].str();
                std::wsmatch dummy;
                if (std::regex_match(annees_str, dummy, std::wregex(L"\\d{4}\\-\\d{4}\\s?")))
                {
                    m_f_anneesProduction.first = stoi(annees_str);
                    m_f_anneesProduction.second = stoi(annees_str.substr(5));
                }
    et
    Exemple serie.cpp :
    abc.[2008]
    ou
    abc.[2008-]
    ou
    abc.[2008-2010]
    Meilleur !!! Ok ou pas !
    ===> oui : vraiment !!!
    Donc : abc.[2008] ou abc.[2008-] ou abc.[2008-2010]
    Exemple :
    Titre : [2022-] (sur Disney : 12+) 45min 4,2/5

    --------------------------------
    Les fichiers correspondants ne sont pas dans le dépôt Github.
    Ok !
    https://github.com/laurentbouleau/Exemple : Août 23 (27/08/2024)

    ----------------------------------
    Je comprends pas trop votre problème.
    On demande juste à une fonction, ici "Serie::format_Annees", de générer une chaine de caractères, ici la fonction retourne les Années (soit les années de production ou les années de diffusion en fonction des données disponibles) avec le formage qui y correspond : couleur + les [].
    ===> -

    Reposé !!! Fatigué !!!

  14. #854
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    628
    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 : 628
    Points : 0
    Points
    0
    Par défaut
    serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wregex duree_format_rg{ L"([[:digit:]]+)\\s?(min|MIN|Min)\\s*" };
    Ok !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const void Serie::corriger_Annee_Debut()
    ...
    const void Serie::corriger_Annee_Fin()
    Oui : j'ai oublié !!!
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Serie::corriger_Annee_Debut() const

    https://github.com/laurentbouleau/Exemple : Août 23 (27/08/2024)

  15. #855
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    628
    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 : 628
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Août 24 (27/08/2024)

    film_serie.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
    std::vector<std::wstring> fusionner_Titres(const std::vector<std::wstring>& nouveaux_titres, const std::vector<std::wstring>& vieux_titres)
    {
        assert(nouveaux_titres.size() < 4 && L"???");
        assert(vieux_titres.size() < 4 && L"???");
    
        std::vector<std::wstring> resultat = nouveaux_titres;
    
        if (vieux_titres.size() == nouveaux_titres.size())
        {
            //double titres_ration{ 80.0 };
            if (vieux_titres.size() == 1 && nouveaux_titres.size() == 1)
            {
                resultat = vieux_titres;
            }
            if (vieux_titres.size() == 3 && nouveaux_titres.size() == 3 && vieux_titres[0] == nouveaux_titres[0] && vieux_titres[1] != nouveaux_titres[1] && vieux_titres[2] == nouveaux_titres[2])
            {
                resultat[1] = vieux_titres[1];
            }
            if (vieux_titres.size() == 3 && nouveaux_titres.size() == 3 && (vieux_titres[0] != nouveaux_titres[0] || vieux_titres[1] != nouveaux_titres[1] || vieux_titres[2] != nouveaux_titres[2]))
            {
                resultat = vieux_titres;
            }
        }
    
        return resultat;
    }
    et fim.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
    void Film::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& ligne)
    { // Titre
        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));
    
        //std::vector<std::wstring>nouveaux_titres = extraire_Titres_Depuis_UneLigne(contenu[0]);
        std::vector<std::wstring>titres = extraire_Titres_Depuis_UneLigne(contenu[0]);
    
        m_titres = fusionner_Titres(m_titres, titres);
    
        contenu.erase(contenu.begin());
        if (contenu.size() > 0)
        {
            m_duree = initialiser_Duree(contenu[0]);
            contenu.erase(contenu.begin());
            if (contenu.size() > 0)
                m_resume = contenu;
        }
    }
    Bizarre !!!



    On va prendre la ligne suivante :
    "extern const std::wstring lire_fichierTxt(std::wstring const& nomFichier);"
    Vous m'avez collé cette ligne dans :
    ...
    Je comprends pas trop votre problème.
    On demande juste à une fonction, ici "Serie::format_Annees", de générer une chaine de caractères, ici la fonction retourne les Années (soit les années de production ou les années de diffusion en fonction des données disponibles) avec le formage qui y correspond : couleur + les [].
    Je suis crevé !!! Demain ou plus tard !

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

    https://github.com/laurentbouleau/Exemple : Août 25 (28/08/2024)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (int j = std::stoi(nomFichier))
            {
                m_numero = j;
                initialiser_Resume(cheminFichier);
                return;
            }
    Que faire ???

    Pouvez-vous m'expliquer la logique de l'extrait de code précédent, qui fait partie de la fonction "Saison::initialiser_Fichier" ???
    Et "Saison::initialiser_Fichier" a encore un nom foireux car cela ne correspond en rien à ce que la fonction fait réellement.
    Avec ce code, votre saison "Hors Saison" a un champ "m_numero" égale à 4 et votre saison "1" a un champ "m_numero" égale à 15.
    C'est quoi ce raisonnement ?
    Pouvez-vous expliquer ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wstring racine = t + L"Star Wars- The Clone wars.[2008-2020].Animation";
    Marches pas !!!

    Attention : Star Wars Rebels.[2014-2017 Disney+].Animation
    0x1.2024-08-21.txt !!!
    Etc...
    Hors saison.txt !!!

    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[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;
        }
    }
    Expliquez-moi !!!

    Merci vraiment

  17. #857
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 202
    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 202
    Points : 12 358
    Points
    12 358
    Par défaut
    Remarques sur les versions entre "Août 18 (24/08/2024)" et "Août 23 (27/08/2024)" du dépôt GitHub :

    "Août 20 (25/08/2024)" :
    Vous enlevez des "extern" devant quelques déclarations de fonction au début des fichiers "film.cpp" et "serie.cpp".
    Vous pouvez supprimer toutes ces lignes (pour film.cpp : de la ligne 45 à la ligne 90 (et encore "Soundtrack" ne sert à rien); pour serie.cpp : de la ligne 44 à la ligne 90).
    Si cela ne compile plus, c'est que vous avez oublié de faire le #include "qui va bien" (et/ou que vous n'avez pas correctement rempli les .h).

    "Août 22 (26/08/2024)" :
    Vous avez modifié le fichier "./Andor.[2022- Disney+]\2022-09-21\1x06.2024-06-27.txt" pour qu'il n'y ait plus de "\t" en ligne 2.
    Mais, moi, je pense que le problème n'est pas dans le fichier de données en entré, mais dans le code de la fonction "InfosVisionnage::initialiser_Duree" qui gère mal ce cas :
    En ajoutant juste "\\s*" à la fin de "duree_format_rg", on gère facilement un nombre arbitraire d'espaces ou de tabulations horizontales derrière la chaine de caractère "min".
    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 InfosVisionnage::initialiser_Duree(std::wstring& m)
    {
        const std::wregex duree_format_rg{ L"([[:digit:]]+)\\s?(min|MIN|Min)\\s*" };
    
        std::wsmatch match;
    
        if (std::regex_match(m, match, duree_format_rg))
        {
            auto duree_en_minute = std::stoi(match[1]);
            m_duree = duree_en_minute * 60;
        }
        else
        {
            throw std::invalid_argument("'" + std::string{ m.begin(),m.end() } + "' n'est pas un format de durée valide.");
        }
    }
    (Ce code a déjà été donné dans ma précédente réponse.)

    "Août 22 (26/08/2024)" (2ème fois, faudrait s'arranger pour mettre des numéro de version unique dans le dépôt GitHub, SVP !!!):
    Vous ajoutez "const" au paramètre "vieux_titres" de la fonction "fusionner_Titres", mais pourquoi pas aussi sur le paramètre "nouveaux_titres", comme je l'ai fait dans ma réponse ???
    "m_date_en_salle_ou_sur", c'est pas terrible mais c'est quand même largement mieux que "m_date" !!!
    Sur la fonction "initialiser_Titre", vous renommez le paramètre de "m_titre" à "titre", alors qu'il faut complètement le supprimer, vous aimez vous rajouter du travail.
    Rendre "const" les fonction "Serie::corriger_Annee_Debut" et "Serie::corriger_Annee_Fin", c'est pas très logique, vu qu'on modifie les valeurs dans des champs de l'objet.

    cf : film_serie.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    const std::vector<std::wstring> Sur
    {
        L"Apple TV+",
        L"Amazon Prime Video",
        L"Crunchyroll",
        L"Disney+",
        L"DVD",
        L"Netflix",
        L"SⱯLTO",
        L"VOD"
    };
    Pourquoi ?
    Quelle est la question ???

    Il faut juste un peu modifier l'expression régulière pour qu'elle gère le "nouveau" format :
    Pas compris !!!
    cf. la modification de la fonction "InfosVisionnage::initialiser_Duree" que j'ai proposé au début de ce message.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wregex duree_format_rg{ L"([[:digit:]]+)\\s?(min|MIN|Min)\\s*" };
    "Que faire ?" : bin, utiliser le code que j'ai posté à la place du vôtre, non ???
    Attention : m_sur !!!
    Ok, j'avais pas vu qu'il y a un format de la forme "Prey.(2022-08-05 Disney+)" pour les films.
    Il peut avoir une information après la date de sortie mais à l'intérieur des parenthèses ().
    Pas de problème, mais il fait adapter l'expression régulière pour qu'elle capture cette information :
    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
    Film::Film(std::filesystem::path racine)
    {
        this->racine = racine;
        auto nomDossier = racine.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
    
        std::wregex filename_pattern{ L"(.+?)(?:\\.\\((?:(\\d{4})\\-(\\d{2})\\-(\\d{2})\\s*([^\\)]*))\\))?(?:\\.(.+))?$" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring part_1 = match[1];
            m_titres = extraire_Titres_Depuis_NomDeFichierOuDeRepertoire(part_1);
            if (match[2].matched)
            {
                std::wstring annees_str = match[2].str();
                std::wstring mois_str = match[3].str();
                std::wstring jours_str = match[4].str();
                m_date.tm_year = stoi(annees_str) - 1900;  //beurk!!
                m_date.tm_mon = stoi(mois_str) - 1;           //beurk!!
                m_date.tm_mday = stoi(jours_str);
            }
    
            m_sur = (match[5].matched) ? match[5].str() : L"";
    
            m_sous_genre = (match[6].matched) ? match[6].str() : L"";
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
    }
    Heu, avec quoi comme série, ça marche pas, SVP ???

    Avec :
    "Star Wars- The Clone wars.[2008-2020].Animation"
    "Seven Deadly Sins- Four Knights of the Apocalypse.[2023].Manga"
    "Andor.[2022- Disney+]"

    Ca fonctionne.
    Pardon ?
    Vous écrivez que cela ne fonctionne pas, mais quand je teste, les informations sont bien extraites, donc qu'est-ce qui ne fonctionne pas dans ces cas ?
    Car, pour moi, cela fonctionne.

    Quel est le problème ?
    A part que vos méthodes "Episode:: PrintFirstSequenceVisionnage" et "Episode:: PrintSequenceVisionnage", ce qui explique pourquoi seul les informations sur la saison sont affichées.
    Pas compris !
    Vous semblez indiquer que le "non affichage" des informations d'un épisode n'est pas "normal", mais aucun code dans la classe Episode n'affiche d'informations. En particulier, les 2 fonctions citées qui sont vides, donc n'affiche rien, bizarre pour des fonction "Printxxx".

    Pourquoi les informations sur la saison sont foireuses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            if (int j = std::stoi(nomFichier))
            {
                m_numero = j;
                initialiser_Resume(cheminFichier);
                return;
            }
    J'ai oublié !!!
    Si vous ne comprenez pas VOTRE code, personne ne le peut à votre place. Dégagez-le, alors.

    void Serie::corriger_Annee_Debut() const
    {
    ...
    }
    ...
    void Serie::corriger_Annee_Fin() const
    {
    ...
    }
    Marches pas !!!
    Vous pouvez m'expliquer ces "const" ???

    Comment faire ? ===> film_serie.cpp) : void initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& titre) ???
    Bin, en faisant simple et générique (type de données un peu complexe car vous découpez très très mal votre code en fonctions INDEPENDANTES):

    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
    std::optional<long> extraire_Duree_DepuisUneLigneDUnFichier(const std::wstring& ligne)
    {
        const std::wregex duree_format_rg{ L"^(?:(\\d+)\\s?(?:h|H)\\s?)?(?:(\\d+)\\s?(?:min|MIN)\\s?)?$" };
        std::wsmatch match;
        std::optional<long>  duree;
        if (std::regex_match(ligne, match, duree_format_rg))
        {
            duree = (match[1].matched ? std::stoi(match[1]) : 0) * 60 * 60 + (match[2].matched ? std::stoi(match[2]) : 0) * 60;
        }
        else
        {
            throw std::invalid_argument("'" + std::string{ ligne.begin(),ligne.end() } + "' n'est pas un format de durée valide.");
        }
        return duree;
    }
     
    std::tuple<std::vector<std::wstring>, std::optional<long>, std::vector<std::wstring>> extraire_Informations_DepuisLeContenuDUnFichier(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));
     
        std::vector<std::wstring>nouveaux_titres = extraire_Titres_Depuis_UneLigne(contenu[0]);
     
        std::optional<long> duree;
     
        contenu.erase(contenu.begin());
        if (contenu.size() > 0)
        {
            duree = extraire_Duree_DepuisUnLigneDUneFichier(contenu[0]);
            contenu.erase(contenu.begin());
        }
     
        return { nouveaux_titres , duree , contenu };
    }
    En utilisant encore vos fonctions "Serie::initialiser_Titre" et "Film::initialiser_Titre" qui ont encore des noms TOUT POURRIS !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Serie::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);
    }
    Même code pour " Film::initialiser_Titre".
    Mais ces fonctions sont clairement des conneries ; car elles font beaucoup trop de choses à la fois.
    Donc ne pas perdre du temps à les refactorer ; mais changer le code qui les appels pour qu'il soit plus "logique".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initialiser_Titre_Original(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre_original){...}
    Elle sert à quoi maintenant ???

    Faut juste remplacer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (nomFichier == L"Titre original.txt")
    {
        initialiser_Titre_Original(cheminFichier, m_titres_originaux);
    }
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (nomFichier == L"Titre original.txt")
    {
        m_titres_originaux = extraire_Titres_Depuis_UneLigne(lire_fichierTxt(cheminFichier));
    }
    Pensez à changer la signature de la fonction "extraire_Titres_Depuis_UneLigne" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> extraire_Titres_Depuis_UneLigne(const std::wstring& ligne){...}
    Vous devez comprendre à quoi servent les fichiers d'en-tête (.h).

    On va prendre la ligne suivante :
    "extern const std::wstring lire_fichierTxt(std::wstring const& nomFichier);"
    Vous m'avez collé cette ligne dans :
    film.cpp
    serie.cpp
    film_serie.cpp

    Alors que vous n'avez qu'à la mettre UNE fois (sans l'"extern") dans "film_serie.h".
    ...
    Vous faites la même chose pour toutes les fonctions qui sont définies dans "film_serie.cpp".

    Et vous remplacez ces dizaines de lignes à la con dans les 3 fichier .cpp par un simple :
    Comment faire ???
    Vous devez comprendre à quoi servent les fichiers d'en-tête (.h).

    "Kaleidoscope.[2023 Netflix]", ça plante sur le traitement du fichier ".\Kaleidoscope.[2023 Netflix]\2023-01-01\1x8.2024-03-03.txt" qui est vide.
    Dans votre fonction "lire_fichierTxt" :
    ...

    Donc, pour un fichier vide, vous renvoyez un std::vector de taille 1 dont le premier et seule élément est une chaine vide.

    Mais dans votre fonction "InfosVisionnage::InfosVisionnage":
    ...
    Dans ce cas, l'expression "file_content.size() > 0" est vraie.
    L'expression 'file_content[0] != L""' est en commentaire.
    "m_NumeroEpisode " est égale à 8, c'est correct.
    "pos = file_content[0].find(L". ");" => pos est égale à std::npos (-1).
    "pos + 2" est égale à 1.
    "file_content[0].substr(1)" renvoie une erreur car "file_content[0]" n'est "long" que de 0 caractère, donc 1, c'est trop loin.

    Vous gérez donc très mal les valeurs de retour des fonctions "find" et/ou "lire_fichierTxt".

    Pour "Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga", même problème que pour "Kaleidoscope.[2023 Netflix]", le fichier ".\Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga\2021-11-02\1x1.2024-03-22_.txt"

    Pour "SupraCell.[2024 Netflix].Mini-série", où est le problème ? (C'est aussi pourri que pour "Star Wars Rebels.[2014-2017].Animation")

    Pour "Azertyuiop £££.[2024].Mini-série", où est le problème ? (C'est aussi pourri que pour "Star Wars Rebels.[2014-2017].Animation")
    Ah ! Mince ! Alors, expliquez-moi ???
    Je viens de donner une explication détaillée de ce qui se passe. Que voulez-vous de plus ?
    Qu'est-ce qui n'est pas clair dans l'explication ?
    C'est peut-être pas clair PARCE QUE VOTRE code n'est pas clair, non ?

    Exemple serie.cpp :
    abc.[2008]
    ou
    abc.[2008-]
    ou
    abc.[2008-2010]
    Meilleur !!! Ok ou pas !
    ===> oui : vraiment !!!
    Donc : abc.[2008] ou abc.[2008-] ou abc.[2008-2010]
    Exemple :
    Titre : [2022-] (sur Disney : 12+) 45min 4,2/5
    C'est vraiment pas clair.
    C'est juste ajouter un "-" dans les dates quand on n'a pas une date de fin ???

    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;
        }
    }

  18. #858
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 202
    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 202
    Points : 12 358
    Points
    12 358
    Par défaut
    Remarques sur les versions entre "Août 23 (27/08/2024)" (2ème fois, faudrait s'arranger pour mettre des numéro de version unique dans le dépôt GitHub, SVP !!!)(BIS) et "Août 25 (28/08/2024)" du dépôt GitHub :

    "Août 23 (27/08/2024)" (2ème fois)
    initialiser_Titre_Original change de signature, mais à quoi elle sert vraiment ? (cf. mon post précédent)
    Changement du nom du paramètre de la fonction "extraire_Titres_Depuis_UneLigne", cool !!!
    Changement de la "constness" des fonctions "Serie::corriger_Annee_Debut" et "Serie::corriger_Annee_Debut" mal fait. (cf. mon post précédent = plus de "const")

    "Août 24 (27/08/2024)"
    Vous permutez les noms des paramètres de la fonction "fusionner_Titres".
    Je ne comprends absolument pas ce code.
    Pouvez-vous l'expliquez pour avoir de meilleurs noms de fonctions et de paramètres ?
    (par explication, c'est comment il doit fonctionner, pas ce qu'il fait, SVP)

    "Août 25 (28/08/2024)"
    Vous supprimer '#include "film_serie.h"',des fichier "film.cpp" et "serie.cpp" montrant que vous n'avez toujours pas compris l'utilité des fichiers d'en-tête.
    "Ca fonctionne" parce que vous avez toujours près de 50 lignes A LA CON au début de ces fichiers au lieu de garder cet #include.
    Mais vous devez aussi correctement remplir les .h avec ce qu'il faut, et pas des trucs "au pif".
    Dans "film_serie.h", vous ne devez déclarer QUE les fonctions définies dans "film_serie.cpp".
    Idem dans "utils.h", etc...
    Les .h ne doivent inclure (via #include) que le strict minimum, donc rien ou presque.

    Dans "serie.cpp" "ajout" de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      if (file_content.size() > 0 && file_content[0] != L"")
    {...}
    Ok, fragile mais fonctionnel.


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

    film_serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<std::wstring> fusionner_Titres(const std::vector<std::wstring>& nouveaux_titres, const std::vector<std::wstring>& vieux_titres)
    {...}
    et fim.cpp :
    void Film::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& ligne)
    {...}
    Bizarre !!!
    cf. "Août 24 (27/08/2024)"
    Vos noms ne sont pas clairs !!!
    Si vous n'arrivez pas à comprendre VOTRE logique, imaginez les autres.

    -------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (int j = std::stoi(nomFichier))
            {
                m_numero = j;
                initialiser_Resume(cheminFichier);
                return;
            }
    Que faire ???
    Bin, c'est vous qui avez ajouté ce code pour lire et prendre en compte les fichiers "4.txt" et autres "11.txt", etc...
    C'est vous qui devriez savoir à quoi ils servent et donc savoir comment les utiliser.
    Si vous ne savez pas, dégagez ce code.

    Pouvez-vous m'expliquer la logique de l'extrait de code précédent, qui fait partie de la fonction "Saison::initialiser_Fichier" ???
    Et "Saison::initialiser_Fichier" a encore un nom foireux car cela ne correspond en rien à ce que la fonction fait réellement.
    Avec ce code, votre saison "Hors Saison" a un champ "m_numero" égale à 4 et votre saison "1" a un champ "m_numero" égale à 15.
    C'est quoi ce raisonnement ?
    Pouvez-vous expliquer ???
    C'est moi qui vous demande d'expliquer le code que VOUS avez écrit.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wstring racine = t + L"Star Wars- The Clone wars.[2008-2020].Animation";
    Marches pas !!!
    J'ai pas les fichiers qui correspondent à ce cas dans le dépôt GitHub.

    Attention : Star Wars Rebels.[2014-2017 Disney+].Animation
    0x1.2024-08-21.txt !!!
    Etc...
    Hors saison.txt !!!
    C'est quoi la 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
    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[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;
        }
    }
    Expliquez-moi !!!
    Faut juste lire le code.
    "std::wstring Serie::format_Annees()" : c'est une fonction qui renvoie une chaine de caractères ("std::wstring"), qui correspond aux années formatées "Serie::format_Annees()" pour l'affichage dans la console. (Années, c'est flou, mais vous ne nous avez toujours pas donné la logique corresponde (années de diffusion ? années de production ? etc ...))
    "const", cette fonction n'a pas le droit de modifier les champs de l'objet (assez logique pour une fonction qui ne fait renvoyer une chaine en fonction des valeurs des champs de l'objet).
    Après, on vérifie le contenu du champ "m_f_anneesProduction", correspondant aux années de production, qui est de type "std::pair<std::optional<int>, std::optional<int>>".
    Donc, "m_f_anneesProduction" est une paire (std::pair) de 2 entiers (int) mais potentiellement non renseigné (std::optional).
    Si l'année de début de production : "m_f_anneesProduction.first", est renseigné ET si l'année de fin de production : "m_f_anneesProduction.second" est aussi renseigné, la fonction retourne une chaine de caractère de la forme "[xxxx-yyyy]", avec xxxx l'année de début de production et yyyy l'année de fin de production . (plus tous les machins pour les afficher de la "bonne" couleur).
    Sinon, si l'année de début de production : "m_f_anneesProduction.first", est renseigné (mais implicitement l'année de fin de production ne l'est pas), la fonction retourne une chaine de caractère de la forme "[xxxx]", avec xxxx l'année de début de production (format légèrement différent avec le code posté dans mon précédent message). (plus tous les machins pour les afficher de la "bonne" couleur).
    Sinon on demande à la fonction "calculer_Annees_Diffusion" de renvoyer les années de diffusion de la série, et la fonction retourne une chaine de caractère de la forme "[xxxx-yyyy]", avec xxxx l'année de début de diffusion et yyyy l'année de fin de diffusion. (plus tous les machins pour les afficher de la "bonne" couleur).

    P.S.:
    Les fichiers "4.txt" et autres "11.txt" sont peut-être des fichiers pour stocker les informations sur des episodes avant que vous ayez commencé à les visionner, non ?

  19. #859
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    628
    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 : 628
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Août 26 (29/08/2024)

    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 !

    Nom : Capture d’écran 2024-08-29 230943.png
Affichages : 30
Taille : 200,2 Ko
    et :
    Star Wars : Episode VII - Le réveil de la force
    et pas :
    Star Wars - Episode VII - Le réveil de la force
    Voilà !!!
    Demain plus tard !

    Fatigué !

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

    https://github.com/laurentbouleau/Exemple : Août 27 (30/08/2024)
    film_serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
    std::optional<long> extraire_Duree_DepuisUneLigneDUnFichier(const std::wstring& ligne)
    ...
    std::tuple<std::vector<std::wstring>, std::optional<long>, std::vector<std::wstring>> extraire_Informations_DepuisLeContenuDUnFichier(std::filesystem::path const& cheminFichier)
    ...
    Mais : (fim.cpp)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            if (nomFichier == L"Making-of.txt")
            {
                //initialiser_Making_of(cheminFichier);
            }
    Marches pas !!!

    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