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. #721
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 130
    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 130
    Points : 12 226
    Points
    12 226
    Par défaut
    std::wstring m_titres2; ===> void Serie::initialiser_Titre2(...)
    "m_titres2", c'est pas top comme nom de champ.
    Actuellement, ce champ est initialisé dans le constructeur de la classe Serie.
    Je ne vois pas l'intérêt d'ajouter une fonction qui ne fera pas plus que ce qui est fait dans le constructeur, une simple affectation.

    std::wstring m_dates2; ===> void Serie::initialiser_Dates(...)
    Idem pour "m_dates2", c'est un champ dont le nom n'est pas explicite. Pourquoi ce "2" ?
    Idem que "m_titres2", pourquoi faire une fonction "Serie::initialiser_Dates" dédiées ???
    J'ai l'impression que c'est plus une/des années d'émissions que des "dates".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (!found)
        {
            exit(1);
        }
    C'est quoi ce MACHIN ????
    Pas d'exit, BORDEL !!!
    Lancez une exception si c'est nécessaire, mais pas d'appel à la fonction "exit" !!!

    Je trouve que l'utilisation d'une expression régulière dans le constructeur de Serie, à la place de tous ces "find_first_of", "find_last_of", "substr", etc... rendrait le code plus simple et lisible.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
             found = initialiser_Sous_Genre(sous_genre);
            m_sous_genre = sous_genre;
    Preuve que votre implémentation/conception de la fonction "initialiser_Sous_Genre" est un peu foireuse : vous avez oublié de vérifier la valeur de "found" avant d'initialiser le champ "m_sous_genre".
    Je pense que "initialiser_Sous_Genre" devrait retourner une valeur "normalisée" du sous-genre, et pas un booléen dont on se contrefout.

    std::wstring m_sur; ===> void Serie::initialiser_Sur(...)
    Idem "m_titres2", c'est pas top comme nom de champ.
    C'est pas plutôt le distributeur/producteur/éditeur de la série ou partie de la série ?
    Pourquoi une fonction dédiée à son initialisation ???

    Simplifiez votre code, n'ajoutez pas des fonctions inutiles si vous ne prévoyez rien dans le futur.

    https://www.disneyplus.com/fr-fr/ : 3 moi : Gratuits
    Donc : you - Copie : Utils.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const void afficher_Disney_SJ(std::wstring& d, std::wstring const& nomFichier, std::wstring& d_sj)
    et :
    film.h/.cpp et serie.h/.cpp
    J'ai rien compris.
    Le projet You : son dépôt Git n'a pas changé depuis Mars.
    "SJ" pour ?
    Les noms des arguments "d" et "d_sj", ça me semble bien obscur.
    "afficher_Disney_SJ", c'est quoi ??? Un mode d'affichage d'informations "spéciale" ???

    Star Wars- The Clone wars.[2008-2020].Animation
    • 2008
    • 2009
    • 2010
    • 2011
    • 2012-09-29
    • 2014-03-07
    • 2022-02-17



    Problème et solution ???
    C'est à vous d'exprimer le problème, pas à nous.

    Si je devine bien, c'est que le nom du répertoire racine d'une saison peut n'indiquer qu'une année et pas une date.
    Moi, je ne comprends pas la notion de "date" dans une saison.
    C'est quoi comme date ? La date de première diffusion ???
    Faut juste modifier le constructeur de la classe Saison pour qu'il s'adapte au nouveau format de nom de répertoire racine d'une saison.
    Chose qu'une expression régulière, à la place de ces "find" et autres "substr", rendrait très simple, avec des parties optionnelles dans les motifs à rechercher dans les noms de répertoire.
    Il faudra vraisemblablement changer le type du champ "m_dossier"(mais aussi son- nom, qui ne veut rien dire de clair) pour qu'il reflète ce cas, ou trouver les informations manquantes ailleurs, comme dans les fichiers contenus dans le répertoire "racine" de la saison.

  2. #722
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

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

    https://github.com/laurentbouleau/Exemple : Juin 14 (17/06/2024)

    J'en ai marre !!!

    Demain, ou plus tard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serie::Serie(std::filesystem::path racine)
    Parce que :
    • m_titres2 (wstring ou vector)
    • m_dates2 (struct DateRecord ou tm)
    • m_sous_genre (wstring)
    • m_sur (wstring)

    Pas fini !!!

    Et :
    Instructions try, throw et catch ? Ou quoi ? assert, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Saison::initialiser_Netflix(fs::path const& cheminFichier)
    ...
    void Saison::Print_Netflix()
    et j'ai oublié !!!

    Et : SJ.txt : La signalétique jeunesse : SJ : https://www.arcom.fr/se-documenter/r...et-des-mineurs

    Mais (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
    ...
    void initialiser_Disney_SJ(fs::path const& cheminFichier, std::wstring& m_d_sj)
    { // Disney+ SJ
        auto nomFichier = cheminFichier.wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
     
        std::wstring d = lire_fichierTxt(nomFichier);
        assert((d.size() != 0));
        try
        {
            if (d == L"6+" || d == L"12+" || d == L"14+")
            {
                m_d_sj = d;
            }
        }
        catch (runtime_error const& exception)
        {
            std::wcout << L"Erreur : " << exception.what() << std::endl;
        }
    }
    ...
    Etc...

    Merci

  3. #723
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    Nom : Capture d’écran 2024-06-17 221227.png
Affichages : 97
Taille : 7,7 Ko

  4. #724
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 130
    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 130
    Points : 12 226
    Points
    12 226
    Par défaut
    Demain, ou plus tard :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Serie::Serie(std::filesystem::path racine)
    Je pense que vous mettez la charrue avant les bœufs.
    Vous ajoutez des machins et des trucs et des bidules (comme ce "Disney_SJ"), sans factoriser votre code.
    Vous pondez du code au kilomètre qu'il faudra entièrement reprendre à chaque changement de conception.
    Posez-vous et commencez à simplifier votre code, qui est bien trop compliqué pour ce qu'il fait.

    Parce que :
    • m_titres2 (wstring ou vector)
    • m_dates2 (struct DateRecord ou tm)
    • m_sous_genre (wstring)
    • m_sur (wstring)
    Et ?, je vois rien qui empêche de faire un simple "m_XXX = variableAvecLaBonneValeur;" dans le constructeur de l'objet.

    Pas fini !!!
    Ce que je vous demande, c'est justement de ne pas faire du code inutile.

    Et :
    Instructions try, throw et catch ? Ou quoi ? assert, ...
    "assert" pour les erreurs de programmation (situation qui ne devrait pas arrivée si le code fait correctement son travail) et "throw" pour les situations exeptionnelles ou liée à des erreurs de données ou de l'utilisateur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Saison::initialiser_Netflix(fs::path const& cheminFichier)
    ...
    void Saison::Print_Netflix()
    Pourquoi faire ? Vous ajoutez du code sans logique d'ensemble.

    Vous avez une interface "console" avec un nombre de ligne et de colonne limitée. Concevez votre interface pour savoir où mettre les informations et de combien de colonnes et de lignes on dispose pour chacune de ces informations.
    Comment récupérer les informations, c'est accessoire. On trouvera toujours un moyen de récupérer l'information, mais l'afficher, c'est une autre histoire.

    Et : SJ.txt : La signalétique jeunesse : SJ : https://www.arcom.fr/se-documenter/r...et-des-mineurs
    Ne soyez pas radin avec les noms, SVP.
    SJ => signaletique_jeunesse
    Vous avez un IDE qui complète la fin des mots pour vous !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void initialiser_Disney_SJ(fs::path const& cheminFichier, std::wstring& m_d_sj)
    Horriblement compliqué pour rien. (C'est quoi ce try/catch qui sert à rien, sauf de débuguer confortablement ???)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    std::wstring recuperer_Disney_SJ(fs::path const& cheminFichier)
    { // Disney+ SJ
        auto nomFichier = cheminFichier.wstring();
     
        std::wstring content = lire_fichierTxt(nomFichier);
     
        std::wregex sj_pattern{ L"(6\\+|12\\+|14\\+)" };
        std::wsmatch match;
        if (std::regex_match(content, match, sj_pattern))
        {
            return match[1];
        }
        return L"";
    }
    P.S.: Votre configuration "Debug" est toujours en "(Zi)" et pas "(ZI"), pourquoi vous mettre des bâtons dans les roues pour facilement utiliser le débogueur ?

  5. #725
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

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

    film_serie.ccp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    std::wstring recuperer_Disney_SJ(fs::path const& cheminFichier)
    ...
    std::wstring recuperer_Netflix_SJ(fs::path const& cheminFichier)
    ...
    std::wstring recuperer_SJ(fs::path const& cheminFichier)
    ...
    Et : 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
    ...
    const void Serie::Print_Titre()
    {
        if (affichage_titres_actif)
        {
            std::wstring titres_str;
            std::wstring wstr;
            titres_str = keyColor[0] + L"Titre : " + valuesColor + m_titres[0];
            if (m_titres.size() > 1)
                titres_str += keyColor[1] + m_titres[1] + valuesColor + m_titres[2];
    ...
            // sur
            if (affichage_sur_actif && m_sur != L"")
            {
                titres_str += keyColor[0] + L" (sur " + valuesColor + m_sur + keyColor[0] + L" : " + valuesColor;
                // Disney+ SJ
                if (affichage_disney_sj_actif && m_disney_sj.length() != 0)
                    titres_str += m_disney_sj;
                // Netflix SJ
                if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0)
                    titres_str += m_netflix_sj;
                titres_str += keyColor[0] + L')' + valuesColor;
            }
            else
            {
                // Disney+ SJ
                if (affichage_disney_sj_actif && m_disney_sj.length() != 0)
                    titres_str += keyColor[0] + L" (" + valuesColor + L"Disney+ : " + m_disney_sj + keyColor[0] + L')' + valuesColor;
                // Netflix SJ
                if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0)
                    titres_str += keyColor[0] + L" (" + valuesColor + L"Netflix : " + m_netflix_sj + keyColor[0] + L')' + valuesColor;
            }
            // La signalétique jeunesse
            if (affichage_sj_actif && m_sj.length() != 0)
                titres_str += keyColor[0] + L" (" + valuesColor + L"SJ" + keyColor[0] + L" : " + valuesColor + m_sj + keyColor[0] + L')' + valuesColor;
    ...
    Ok !!!

    Maintenant, je suis fatigué !!! Alors, Otho et kiné !!! (Mardi !!!)

    Après, se soir ou demain :
    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
    Serie::Serie(std::filesystem::path racine)
    {
        this->racine = racine;
        auto nomDossier = racine.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
     
        std::size_t pos = 0;
        pos = nomDossier.find_first_of(L".[");
        m_titres2 = nomDossier.substr(0, pos);
     
        nomDossier = nomDossier.substr(pos + 2);
        std::wstring textes = nomDossier;
        pos = textes.find_last_of(L"]");
        textes = textes.substr(0, pos);
        bool found = false;
        for (unsigned i = 0; i < textes.length(); ++i)
        {
            if (textes.at(i) == L' ' || textes.at(i) == std::wstring::npos)
            {
                m_dates2 = textes.substr(0, i);
                found = true;
                if (textes.at(i) == L' ')
                {
                    textes = textes.substr(i);
                }
            }
        }
        if (!found)
        {
            m_sur = L"";
        }
        if (textes[0] != L']')
        {
            //textes = textes.substr(1);
            //m_sur = textes;
        }
        std::wstring sous_genre = nomDossier;
        pos = sous_genre.find_last_of(L"]");
        if (sous_genre.at(pos) != std::wstring::npos)
        {
            sous_genre = sous_genre.substr(pos + 2);
            found = initialiser_Sous_Genre(sous_genre);
            m_sous_genre = sous_genre;
        }
    }
    Pouvez-vous expliquer pas-à-pas ? Exemple : m_titre2 ou m_titres ou...
    Avec :
    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
    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> titre = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
        assert((titre.size() != 0));
     
        std::wregex titre_pattern{ L"(.+?)(\\s:\\s|:\\s|/|\\s-\\s)(.+)" };
        std::wsmatch match;
        if (std::regex_match(titre[0], match, titre_pattern))
        {
            m_titres.push_back(match[1]);
            if (match.length() > 2)
            {
                m_titres.push_back(match[2]);
            }
            if (match.length() > 3)
            {
                m_titres.push_back(match[3]);
            }
        }
        else
        {
            m_titres.push_back(titre[0]);
        }
        titre.erase(titre.begin());
        if (titre.size() > 0)
        {
            initialiser_Duree(titre[0]);
            titre.erase(titre.begin());
            if (titre.size() > 0)
                m_resume = titre;
        }
    }
    Merci

  6. #726
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0

  7. #727
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

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

    P.S.: Votre configuration "Debug" est toujours en "(Zi)" et pas "(ZI"), pourquoi vous mettre des bâtons dans les roues pour facilement utiliser le débogueur ?
    Oh Oui, c'est vrai !!!

    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
    Serie::Serie(std::filesystem::path racine)
    {
        this->racine = racine;
        auto nomDossier = racine.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
    
        std::size_t pos;// = 0;
        pos = nomDossier.find_first_of(L".[");
        assert(pos != std::wstring::npos && L"???");
        const std::wstring titres = nomDossier.substr(0, pos);
        m_titres = Dossier_Titres(titres);
    ...
    }
    ...
    std::vector<std::wstring> Serie::Dossier_Titres(std::wstring titre)
    {
        assert(titre.length() > 0 && L"Nom de dossier vide"); // ??? pour Mot de... ?
        bool found = false;
        size_t pos = 0;
        const std::wstring d_p = L" - ";
        pos = titre.find(d_p);
        if (!found && pos != std::wstring::npos)
        {
            m_titres.push_back(titre.substr(0, pos));
            m_titres.push_back(d_p);
            m_titres.push_back(titre.substr(pos + 3));
            found = true;
        }
        const std::wstring d_p2 = L"- ";
        pos = titre.find(d_p2);
        if (!found && pos != std::wstring::npos)
        {
            m_titres.push_back(titre.substr(0, pos));
            m_titres.push_back(d_p2);
            m_titres.push_back(titre.substr(pos + 2));
            found = true;
        }
        const std::wstring d_p3 = L"- ";
        pos = titre.find(d_p3);
        if (!found && pos != std::wstring::npos)
        {
            m_titres.push_back(titre.substr(0, pos));
            m_titres.push_back(d_p3);
            m_titres.push_back(titre.substr(pos + 1));
            found = true;
        }
        if (!found)
        {
            m_titres.push_back(titre);
            found = true;
        }
        return m_titres;
    }
    ...
    Ok ou pas ?

  8. #728
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Juin 17 (19/06/2024)

    Exemple :
    Dossier :
    Azertyuiop £.[2021-2023 Netflix].Manga
    Et
    titre.txt
    Azertyuiop ?
    25 min
    blablabla
    you :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    const std::vector<wchar_t> Exception_des_elements
    {
        L'\\',
        L'/',
        L':',
        L'*',
        L'?',
        L'"',
        L'<',
        L'>',
        L'|'
    };
    et 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
    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> titre = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
        assert((titre.size() != 0));
    
        std::vector<std::wstring> titres2;
    
    
        std::wregex titre_pattern{ L"(.+?)(\\s:\\s|:\\s|/|\\s-\\s)(.+)" };
        std::wsmatch match;
        if (std::regex_match(titre[0], match, titre_pattern))
        {
            titres2.push_back(match[1]);
            if (match.length() > 2)
            {
                titres2.push_back(match[2]);
            }
            if (match.length() > 3)
            {
                titres2.push_back(match[3]);
            }
        }
        else
        {
            titres2.push_back(titre[0]);
        }
    
        bool found = false;
    
        if (m_titres.size() == 1 && titres2.size() == 1 && m_titres == titres2)
        {
            found = true;
        }
        if (!found && m_titres.size() == 1 && titres2.size() == 1 && m_titres[0].length() == titres2[0].length())
        {
            m_titres[0] = titres2[0];
            found = true;
        }
        if (!found && m_titres[0].length() == titres2[0].length() && m_titres[2].length() == titres2[2].length())
        {
            m_titres[1] == titres2[1]; // ???
            found = true;
        }
    
        //???
    
        titre.erase(titre.begin());
        if (titre.size() > 0)
        {
            initialiser_Duree(titre[0]);
            titre.erase(titre.begin());
            if (titre.size() > 0)
                m_resume = titre;
        }
    }
    Que faire ?
    #include <???>
    m_titres[0] = titres2 ???

    Merci

  9. #729
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

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

    https://github.com/laurentbouleau/Exemple : Juin 18 (20/06/2024)

    Avec :
    serie.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Serie
    {
    ...
        void initialiser_En_relation_avec(std::filesystem::path const& cheminFichier);
    ...
        const void Print_En_relation_avec();
    ...
        std::wstring m_en_relation_avec;
    ...
        bool affichage_en_relation_avec_actif = true;
    ...
    };
    et serie.cpp !

    Merci

  10. #730
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    https://en.cppreference.com/w/cpp/standard_library : Pas de google !!!
    Comment faire ?

    Azertyuiop £ = Azertyuiop ?
    Merci

  11. #731
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 130
    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 130
    Points : 12 226
    Points
    12 226
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    std::wstring recuperer_Disney_SJ(fs::path const& cheminFichier)
    ...
    std::wstring recuperer_Netflix_SJ(fs::path const& cheminFichier)
    ...
    std::wstring recuperer_SJ(fs::path const& cheminFichier)
    ...
    Ok, mais attention dans "recuperer_Netflix_SJ", vous avez des typo :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wregex sj_pattern{ L"(7\\+|10\\+|13\\+|16\\+|18+\\Tous publics)" };
    C'est plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wregex sj_pattern{ L"(7\\+|10\\+|13\\+|16\\+|18\\+|Tous publics)" };
    Et essayez de factoriser le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
     
    ...
    std::wstring filter_values( std::wstring const& content, std::vector<std::wstring> const& values)
    {
        std::wstring pattern;
        for (const auto value : values) {
            if (pattern.length() > 0) { pattern += L"|"; }
            pattern += value;
        }
        std::wregex value_pattern{ L"(" + pattern + L")" };
        std::wsmatch match;
        if (std::regex_match(content, match, value_pattern))
        {
            return match[1];
        }
        return L"";
    }
    ...
    std::wstring recuperer_Disney_SJ(fs::path const& cheminFichier)
    { // Disney+ SJ
        auto nomFichier = cheminFichier.wstring();
     
        std::wstring content = lire_fichierTxt(nomFichier);
     
        return filter_values(content, { L"6\\+",L"12\\+",L"14\\+" });
    }
    ...
    std::wstring recuperer_Netflix_SJ(fs::path const& cheminFichier)
    { // Netflix SJ
        auto nomFichier = cheminFichier.wstring();
     
        std::wstring content = lire_fichierTxt(nomFichier);
     
        return filter_values(content, { L"7\\+",L"10\\+",L"13\\+", L"16\\+", L"18\\+", L"Tous publics"});
    }
    ....
    Avec la fonction "filter_values", vous factorisez le code.

    Mais vous pouvez aussi remarquer que les fonctions "recuperer_Disney_SJ", "recuperer_Netflix_SJ", ou "recuperer_SJ", sont aussi assez proches.
    Je pense donc qu'il serait plus simple de fusionner ces fonctions en une seule fonction "filter_signalitique_jeunesse" qui prendrait en paramètre la liste des valeurs possibles en paramètre (comme la fonction "filter_values").

    En factorisant le code, vous avez moins de code, donc moins d'erreurs d'étourderie (cf. le "|18+\\Tous publics"), et si vous avez à corriger un bug sur le filtrage ou à l'améliorer, vous ne le ferez qu'à un endroit.

    Avec votre code de la fonction "Serie:: Print_Titre()", pour savoir comment est construit l'affichage du titre, vous devez suivre TOUT le code de la fonction.
    C'est lourd.
    Faites plus simple, par étape :

    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
    const void Serie::Print_Titre()
    {
        if (affichage_titres_actif)
        {
            std::wstring titres_str;
            std::wstring sur_str;
            std::wstring sj_str;
            std::wstring note_str;
    
            titres_str = keyColor[0] + L"Titre : " + valuesColor + m_titres[0];
            if (m_titres.size() > 1)
                titres_str += keyColor[1] + m_titres[1] + valuesColor + m_titres[2];
            /*if (m_date_Diffusee_a_partir_de_[0] && Date_Diffusee_a_partir_de[0].tm_year != 0)
            {
                wchar_t date_string[22];
                wcsftime(date_string, 15, L"%Y", &Date_Diffusee_a_partir_de[0]);
                wstr = date_string;
                titres_str += keyColor[0] + L" (" + valuesColor + wstr + keyColor[0] + L')' + valuesColor;
            }*/
            // sur
            if (affichage_sur_actif && m_sur != L"")
            {
                sur_str += keyColor[0] + L" (sur " + valuesColor + m_sur + keyColor[0] + L" : " + valuesColor;
                // Disney+ SJ
                if (affichage_disney_sj_actif && m_disney_sj.length() != 0)
                    sur_str += m_disney_sj;
                // Netflix SJ
                if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0)
                    sur_str += m_netflix_sj;
                sur_str += keyColor[0] + L')' + valuesColor;
            }
            else
            {
                // Disney+ SJ
                if (affichage_disney_sj_actif && m_disney_sj.length() != 0)
                    sur_str += keyColor[0] + L" (" + valuesColor + L"Disney+ : " + m_disney_sj + keyColor[0] + L')' + valuesColor;
                // Netflix SJ
                if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0)
                    sur_str += keyColor[0] + L" (" + valuesColor + L"Netflix : " + m_netflix_sj + keyColor[0] + L')' + valuesColor;
            }
            // La signalétique jeunesse
            if (affichage_sj_actif && m_sj.length() != 0)
                sj_str += keyColor[0] + L" (" + valuesColor + L"SJ" + keyColor[0] + L" : " + valuesColor + m_sj + keyColor[0] + L')' + valuesColor;
            // Note
            if (affichage_note_actif)
                note_str += Calcul_Note_Affichage();
    
            std::wcout << titres_str << sur_str << sj_str << note_str << std::endl;
        }
    }

    Pour "Serie::Serie", l'utilisation des "find" rend le code peu clair.

    Si l'on considère que le nom du répertoire contient 4 informations (1 obligatoire et 3 autres optionnelles), avec une expression régulière, le code ressemblerait à ceci :
    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
    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"(xxxx)__(yyyy)?__(zzzz)?__(tttt)?" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring titres = match[1];
            m_titres = Dossier_Titres(titres);
    
            m_dates2 = (match[2].matched) ? match[2].str() : L"";
    
            m_sur = (match[3].matched) ? match[3].str() : L"";
    
            std::wstring sous_genre = (match[4].matched) ? match[4].str() : L"";
            m_sous_genre = sous_genre;
        }
        else
        {
            assert(false==true && "Le nom du répertoire n'est pas un nom valide."));
        }
    }
    Il faut juste remplacer "(xxxx)__(yyyy)?__(zzzz)?__(tttt)?" par les "bonnes" valeurs.
    Que doit valoir "xxxx", "yyyy", "zzzz" et "tttt" pour que cela correspond aux différentes parties qui nous intéressent ?
    xxxx : les titres
    yyyy : les "dates"
    zzzz : le diffuseur
    tttt : sous-genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Soluce :(.+?)(?:\\.\\[(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s)?([^\\]]*)\\])?(?:\\.(.+))?
     
    (xxxx) = (.+?)
    (yyyy) = (\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s)
    (zzzz) = ([^\\]]*)
    (tttt) = (.+)
    Pouvez-vous expliquer pas-à-pas ? Exemple : m_titre2 ou m_titres ou...
    Je ne vois pas ce qu'est votre "m_titre2".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void Serie::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre)
    { ...
        std::wregex titre_pattern{ L"(.+?)(\\s:\\s|:\\s|/|\\s-\\s)(.+)" };
    On voit dans le code que l'on veut découper titre en 3 parties.
    Il a ce qui est avant la partie "captée" par le motif "rouge".
    C'est la partie en charge de "capter" le séparateur des 2 autres parties
    Il a ce qui est après la partie "captée" par le motif "rouge".
    Si on décortique la partie "séparateur", elle est composée de 4 parties séparées par des "|" (pipe):
    • \\s:\\s
    • :\\s
    • /
    • \\s-\\s


    "\\s", c'est pour un espace ou une tabulation.
    N'y reconnaissez-vous pas les différents appels à find(" : "), etc... de votre code original ?

    serie.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Serie::Serie(std::filesystem::path racine)
    {
        ...
        m_titres = Dossier_Titres(titres);
    ...
    }
    ...
    std::vector<std::wstring> Serie::Dossier_Titres(std::wstring titre)
    {
        ...
    }
    ...
    "Dossier_Titres" comme nom, c'est vraiment pas terrible.

    En utilisant une expression régulière très proche de celle utilisée dans la fonction "Serie::initialiser_Titre", la fonction "Dossier_Titres" serait bien plus simple et compacte.

    -------------------------
    Nom du répertoire : Azertyuiop - qsdfghjklm.[2021-2023 Netflix].Manga
    Contenu du fichier titre.txt : Azertyuiop/qsdfghjklm

    C'est les mêmes titres, mais les séparateurs sont différents.
    Je vous avais déjà indiqué que mettre le séparateur dans le "std::vector<std::wstring>>" m_titres, c'était pas "logiques".
    Si vous ne mettez pas ces séparateurs dans le champ et la variable locale, vous n'avez qu'à comparer les 2 std::vector "m_titres" et "titre2".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool found = (titres2==m_titres);
    (l'opérateur "==" compare le contenu de chacun des éléments du std::vector)
    ou mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    assert(titres2==m_titre && "Le contenu du fichier ne correspond pas au nom du répertoire");
    (erreur de programmation)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> titre = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
    "titre", c'est vraiment pas terrible, car cela ne contient pas que le titre.
    "content" ou "contenu" serait des noms plus "correctes".

    Que faire ?
    #include <???>
    m_titres[0] = titres2 ???
    C'est quoi la question ???

  12. #732
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    Nom : Capture d’écran 2024-06-20 212609.png
Affichages : 77
Taille : 8,0 Ko
    C'est quoi ?

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Serie::Serie(std::filesystem::path racine)
    {
        this->racine = racine;
        auto nomDossier = racine.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
    
        std::size_t pos, pos2;
        pos = nomDossier.find_first_of(L".[");
        pos2 = nomDossier.find_first_of(L']');
        assert((pos != std::wstring::npos && pos2 != std::wstring::npos && pos < pos2) && L"Attention : pas \".[\" et/ou \"]\" !!!"); // Ok ou pas ?
    
        const std::wstring titres = nomDossier.substr(0, pos);
        m_titres = Dossier_Titres(titres);
    ...
    }
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    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> titres = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
        assert((titres.size() != 0));
     
        std::vector<std::wstring> t;
     
     
        std::wregex titre_pattern{ L"(.+?)(\\s:\\s|:\\s|/|\\s-\\s)(.+)" };
        std::wsmatch match;
        if (std::regex_match(titres[0], match, titre_pattern))
        {
            t.push_back(match[1]);
            if (match.length() > 2)
            {
                t.push_back(match[2]);
            }
            if (match.length() > 3)
            {
                t.push_back(match[3]);
            }
        }
        else
        {
            t.push_back(titres[0]);
        }
     
        bool found = false;
     
        if (m_titres.size() == 1 && t.size() == 1 && m_titres == t)
        {
            found = true;
        }
        if (!found && m_titres.size() == 1 && t.size() == 1 && m_titres[0].length() == t[0].length())
        {
            m_titres[0] = t[0];
            found = true;
        }
        if (!found && m_titres.size() == 3 && m_titres[0].length() == t[0].length() && m_titres[2].length() == t[2].length())
        {
            m_titres[1] = t[1];
            found = true;
        }
     
        //???
     
        titres.erase(titres.begin());
        if (titres.size() > 0)
        {
            initialiser_Duree(titres[0]);
            titres.erase(titres.begin());
            if (titres.size() > 0)
                m_resume = titres;
        }
    }
    Par contre : (exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    void Serie::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre)
    { // Titre
    ...
        int j = 0;
        for(int i = 0; i < m_titres.size(); i++)
        {
            if(m_titres[i] != t[i])
                j++;
        }
        if(j < 4)
        {
            try
            {
            ...
            }
            catch (...]
            {
            ...
            }
        }
    ...
    }
    Ok ou pas ?

    Merci

  13. #733
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

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

    https://github.com/laurentbouleau/Exemple : Juin 20 (21/06/2024)

    Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...
    std::wstring filter_values( std::wstring const& content, std::vector<std::wstring> const& values)
    ...
    std::wstring recuperer_Disney_SJ(fs::path const& cheminFichier)
    ...
    std::wstring recuperer_Netflix_SJ(fs::path const& cheminFichier)
    ...
    Merci beaucoup

  14. #734
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    Bonjour,
    Je suis malade !!!

    https://github.com/laurentbouleau/Exemple : Juin 21 (22/06/2024)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    const void Serie::Print_Titre()
    {
        if (affichage_titres_actif)
        {
            std::wstring titres_str;
            std::wstring sur_str;
            std::wstring sj_str;
            std::wstring note_str;
     
            titres_str = keyColor[0] + L"Titre : " + valuesColor + m_titres[0];
            if (m_titres.size() > 1)
                titres_str += keyColor[1] + m_titres[1] + valuesColor + m_titres[2];
            /*if (m_date_Diffusee_a_partir_de_[0] && Date_Diffusee_a_partir_de[0].tm_year != 0)
            {
                wchar_t date_string[22];
                wcsftime(date_string, 15, L"%Y", &Date_Diffusee_a_partir_de[0]);
                wstr = date_string;
                titres_str += keyColor[0] + L" (" + valuesColor + wstr + keyColor[0] + L')' + valuesColor;
            }*/
            // sur
            if (affichage_sur_actif && m_sur != L"")
            {
                sur_str += keyColor[0] + L" (sur " + valuesColor + m_sur + keyColor[0] + L" : " + valuesColor;
                // Disney+ SJ
                if (affichage_disney_sj_actif && m_disney_sj.length() != 0)
                    sur_str += m_disney_sj;
                // Netflix SJ
                if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0)
                    sur_str += m_netflix_sj;
                sur_str += keyColor[0] + L')' + valuesColor;
            }
            else
            {
                // Disney+ SJ
                if (affichage_disney_sj_actif && m_disney_sj.length() != 0)
                    sur_str += keyColor[0] + L" (" + valuesColor + L"Disney+ : " + m_disney_sj + keyColor[0] + L')' + valuesColor;
                // Netflix SJ
                if (affichage_netflix_sj_actif && m_netflix_sj.length() != 0)
                    sur_str += keyColor[0] + L" (" + valuesColor + L"Netflix : " + m_netflix_sj + keyColor[0] + L')' + valuesColor;
            }
            // La signalétique jeunesse
            if (affichage_sj_actif && m_sj.length() != 0)
                sj_str += keyColor[0] + L" (" + valuesColor + L"SJ" + keyColor[0] + L" : " + valuesColor + m_sj + keyColor[0] + L')' + valuesColor;
            // Note
            if (affichage_note_actif)
                note_str += Calcul_Note_Affichage();
     
            std::wcout << titres_str << sur_str << sj_str << note_str << std::endl;
        }
    }
    et exemple.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class exception_date_tiret
    {
        std::wstring message;
    public:
        exception_date_tiret() : message(L"CCCC-BB-AA pas de...") {}
        std::wstring get_message() const { return message; }
    };
    Merci beaucoup

    ===> Serie::Serie(std::filesystem::path racine)
    ===> void Serie::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre)
    Ah !!! Plus simple ?

  15. #735
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    Il faut juste remplacer "(xxxx)__(yyyy)?__(zzzz)?__(tttt)?" par les "bonnes" valeurs.
    Que doit valoir "xxxx", "yyyy", "zzzz" et "tttt" pour que cela correspond aux différentes parties qui nous intéressent ?
    xxxx : les titres
    yyyy : les "dates"
    zzzz : le diffuseur
    tttt : sous-genre
    Mien compris !
    Avant l'A.V.C. : Lex et/ou Yacc ou pas ?
    Mais, pas mal !!! OK ! Les codes, demain ou plus tard ! Je suis crevé et pas dormis !

    "Dossier_Titres" comme nom, c'est vraiment pas terrible.
    Plus tard !

    Merci beaucoup

  16. #736
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 130
    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 130
    Points : 12 226
    Points
    12 226
    Par défaut

    C'est quoi ?
    Je trouve le message assez explicite, non ?
    Dans la dernière version sous GitHub (pas de nom de version censé malheureusement), les options de compilation en Debug sont non fonctionnelles.
    Attention, beaucoup de personnes ne touchent pas à ces options, car, par défaut, elles sont "correctes".
    Donc, si vous commencez à toucher à cela, faites-le consciencieusement, car les "non spécialistes de Visual Studio" ne pourront plus vous aider.
    J'ai l'impression que cette erreur remonte à la version 'Juin 16 (19/06/2024)", où vous activez le "Base de données du programme pour Modifier et Continuer (/ZI)" en tant que 'format des informations de débogage'", aussi bien en Release qu'en Debug.
    C'est le réglage par défaut en Debug mais pas adapter, en général, en Release.
    Je vous avais indiqué d'utiliser, SI POSSIBLE, l'option "Base de données du programme (/Zi)" en tant que 'format des informations de débogage'" en Release, ce n'est pas l'option par défaut mais compatible avec les autres réglages par défaut en Release.
    Si vous êtes perdu, laissez/remettez les options par défaut.
    Vous avez mis "Non (Gy-)" pour "Activer la liaison au niveau des fonctions", aussi bien en Debug qu'en Release, ce n'est pas adapté au Debug.
    En Debug, vous devriez laisser les réglages par défaut.
    Si vous êtes perdu, laissez/remettez les options par défaut.(BIS)
    Le message d'erreur indique ce problème pour la compilation de "serie.cpp" car vous n'avez modifié que ce fichier depuis la dernière compilation.
    Quand vous changez les options de compilation, faites une régénération complète du projet, pas une compilation "différentielle".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Serie::Serie(std::filesystem::path racine)
    {
    ...
        std::size_t pos, pos2;
        pos = nomDossier.find_first_of(L".[");
        pos2 = nomDossier.find_first_of(L']');
        assert((pos != std::wstring::npos && pos2 != std::wstring::npos && pos < pos2) && L"Attention : pas \".[\" et/ou \"]\" !!!"); // Ok ou pas ?
    Pourquoi pas, cela donne un message plus explicite/précis, mais vous ne gérez pas le fait que cette "section" du nom soit potentiellement optionnel et vous devez gérer "à la main" les tailles des séparateurs. (sans compter les valeurs en dur dans le code)
    Je trouve que ma version à base d'expressions régulières est plus souple.
    Je trouve toujours que l'"assert" est bizarre. Pourquoi est-ce un problème du développeur ? C'est pas plus l'utilisateur qui a fait une "erreur" ? Si oui, c'est un "throw" d'exception et pas un assert qu'il faut utiliser, non ?

    Par contre : (exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    void Serie::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre)
    { // Titre
    ...
        int j = 0;
        for(int i = 0; i < m_titres.size(); i++)
        {
            if(m_titres[i] != t[i])
                j++;
        }
        if(j < 4)
        {
            try
            {
            ...
            }
            catch (...]
            {
            ...
            }
        }
    ...
    }
    Ok ou pas ?
    Pas Ok, vous n'avez pas besoin de try/catch actuellement, car vous ne lancez aucune exception et vous ne gérez pas le problème. (afficher des messages d'erreur, ce n'est pas gérer)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    std::wstring filter_values( std::wstring const& content, std::vector<std::wstring> const& values)
    ...
    std::wstring recuperer_Disney_SJ(fs::path const& cheminFichier)
    ...
    std::wstring recuperer_Netflix_SJ(fs::path const& cheminFichier)
    Ok, mais pourquoi "recuperer_SJ" n'utilise pas "filter_values" ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class exception_date_tiret
    {
        std::wstring message;
    public:
        exception_date_tiret() : message(L"CCCC-BB-AA pas de...") {}
        std::wstring get_message() const { return message; }
    };
    A quoi ça sert ? Pour moi, à rien.
    Donc, pourquoi faire compliqué ? (une simple exception "std::runtime_error" ne fait pas le travail ?)
    Si c'est pour des histoires de "std::wstring", laissez pour l'instant ce truc. Les messages approximatifs feront l'affaire pour l'instant.

    ===> Serie::Serie(std::filesystem::path racine)
    ===> void Serie::initialiser_Titre(fs::path const& cheminFichier, std::vector<std::wstring>& m_titre)
    Ah !!! Plus simple ?
    C'est quoi la question ?
    Pourquoi "Serie::initialiser_Titre" n'est pas appelé par le constructeur ?
    Le but, c'est qu'à la fin du constructeur, l'objet soit complètement initialisé.
    Vous avez plusieurs moyens d'avoir la même information, c'est pas terrible. Il faudrait vérifier que tous ces moyens récupèrent les mêmes valeurs.
    (Ou vous décidez lequel de ces moyens est 'l'officiel'.)

    Avant l'A.V.C. : Lex et/ou Yacc ou pas ?
    C'était un moyen à base d'automates à états finis pour faire un parsing de chaine de caractère selon une "grammaire".
    C'est plus "puissant" mais bien plus complexe à mettre en œuvre.

    "Dossier_Titres" comme nom, c'est vraiment pas terrible.
    Plus tard !
    Non, vous vous trompez de priorité.
    En ne commençant pas par nommer correctement les choses, vous vous mettez des bâtons dans les roues.
    Si vous avez du mal à nommer un truc, c'est vraisemblablement qu'il faut trop de chose à la fois.

  17. #737
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    Attend :
    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
    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"(xxxx)__(yyyy)?__(zzzz)?__(tttt)?" };
        //std::wregex filename_pattern{ L"(.+?)(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s)?([^\\]]*)?(.+)?" };
        std::wregex filename_pattern{ L"(.+?)(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s)?([^\\]]*)?(.+)?" };
        std::wsmatch match;
        if (std::regex_match(nomDossier, match, filename_pattern))
        {
            std::wstring titres = match[1];
            m_titres = Dossier_Titres(titres);
            m_annees = (match[2].matched) ? match[2].str() : L"";
    
            m_sur = (match[3].matched) ? match[3].str() : L"";
    
            std::wstring sous_genre = (match[4].matched) ? match[4].str() : L"";
            m_sous_genre = sous_genre;
        }
        else
        {
            assert(false == true && "Le nom du répertoire n'est pas un nom valide.");
        }
    }
    Nom : Capture d’écran 2024-06-23 212126.png
Affichages : 31
Taille : 5,5 Ko

    https://cplusplus-com.translate.goog...r&_x_tr_pto=sc !!!
    ou

    Narrateur : en haut, en bas, en haut ===> c'est chiant !!!

  18. #738
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        std::wregex filename_pattern{ L"(.+?)(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s)?([^\\]]*)?(.+)?" };
    Comment fait : L".["
    Ou pass ?

  19. #739
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 130
    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 130
    Points : 12 226
    Points
    12 226
    Par défaut
    Ces traductions sont pourries !!!
    C'est normal que vous ne compreniez pas avec ce charabia.
    Essayez de lire la version "originale".

    Narrateur : en haut, en bas, en haut ===> c'est chiant !!!
    Je ne comprends pas.

    Soluce : "(.+?)(?:\\.\\[(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s)?([^\\]]*)\\])?(?:\\.(.+))?"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wregex filename_pattern{ L"(.+?)(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s)?([^\\]]*)?(.+)?" };
    Vous n'avez mis que les "points de capture" mais il fait mettre aussi les éléments qui ne seront pas capturés, comme les ".[" et "]" : les séparateurs.
    Comme ".", "[" et "]" sont des caractères "spéciaux" (interprétés dans la syntaxe des expressions régulières), il fait les précéder par un "", et on ajoute encore un "" pour l'escaping spécifique au C++ :
    Donc :
    L".[" => \\.\\[
    L"]" => \\]
    L"." => \\.

  20. #740
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2021
    Messages : 498
    Points : 0
    Points
    0
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "(.+?)(?:\\.\\[(\\d{4}\\s|\\d{4}\\-\\d{4}\\s|\\d{4}\\-\\s)?([^\\]]*)\\])?(?:\\.(.+))?"
    Ok !

    En Debug, vous devriez laisser les réglages par défaut.
    Ok !

    Quand vous changez les options de compilation, faites une régénération complète du projet, pas une compilation "différentielle".
    ???

    https://github.com/laurentbouleau/Exemple : Juin 22 (24/06/2024)
    ???

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

Discussions similaires

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

Partager

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