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. #881
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    692
    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 : 692
    Points : 0
    Points
    0
    Par défaut
    https://learn.microsoft.com/fr-fr/cp...?view=msvc-170 : Expressions régulières (C++)
    Je suis fatigué ! Je suis crevé !!!

    Exemple : Avec.txt
    azertyuiop : qsdfghjklm
    azertyuiop :
    azertyuiop
    ...
    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
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)
    {
        std::string contenuFichier{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
    
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
    
        contenuFichier = std::string(istreambuf_iterator<char>{fichier}, {});
    
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
    
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
        converti += L'\n';/*L"\r\n"*/;
    
        ???
    
        return clevaleurs;
    }
    Pouvez-vous expliquer ?

    https://regex101.com/r/sEbxUp/1

    Merci vraiment

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

    https://github.com/laurentbouleau/Exemple : Septembre 10 (22/09/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
    void Print_Catalogue(const std::wstring m_sur, std::vector<std::wstring>& m_catalogue, bool affichage_catalogue_actif, std::wstring& keyColor, std::wstring& m_valuesColor)
    {
        // Sur == m_sur ???
        std::wstring sur = L"";
        if (affichage_catalogue_actif)
        {
            for (auto/*&*/ c : m_catalogue)
            {
                if (m_sur == c)
                {
                    sur = m_sur;
                    break;
                }
            }
            std::wstring sur_str;
            for (auto c : m_catalogue)
            {
                if (c == sur)
                {
                    continue;
                }
                else
                {
                    sur_str += keyColor + c + L" : " + m_valuesColor + L"Oui" + keyColor + L" !" + m_valuesColor + L"\r\n";
                }
            }
            std::wcout << sur_str;
        }
    }
    Ok ou pas ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    const std::vector<std::wstring> Sur
    {
        L"Amazon Prime Video",
        L"Arte",
        L"Apple TV+",
        L"Canal+",
        L"Crunchyroll",
        L"Disney+",
        L"DVD",
        L"Max",
        L"Netflix",
        L"Paramount+",
        L"SⱯLTO",
        L"TF1+",
        L"VOD"
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::wstring recuperer_Max_SJ(fs::path const& cheminFichier, std::vector<std::wstring>& m_catalogue)
    { // Max SJ
        auto nomFichier = cheminFichier.wstring();
        std::wstring content = lire_fichierTxt(nomFichier);
     
        auto stem = cheminFichier.stem().wstring();
        m_catalogue.push_back(stem);
     
        return filter_values(content, { L"\\-12" });
    }
    Pourquoi ???

    Mais : avec.txt
    https://regex101.com/r/sEbxUp/1 ???

    Je suis crevé !!!

    Merci

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 258
    Points : 12 471
    Points
    12 471
    Par défaut
    Réponse au message du "19/09/2024, 23h16" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)...
    "Ok" avec les modifications.
    Votre code est quand même assujetti à comment les retours à la lignes sont encodés par une "fonction/constructeur" de la librairie standard : "ifstream fichier{ nomFichier };".
    Vérifiez que cet encodage est "normalisé" en regardant documentation officielle à ce sujet.
    De plus, vous utilisez des "-1", des "-2" et autres "+3" dans votre code qui ne sont corrects que si les retours chariots sont en un caractère (\r OU \n) et que le séparateur soit composé de 3 caractères.
    Le séparateur est un paramètre de la fonction.
    Si votre code ne fonctionne qu'avec un seul séparateur possible, autant ne pas le passer en paramètre.

    Avec un séparateur " : " en dur et en utilisant des expressions régulières :
    https://regex101.com/r/uvW5k5/1
    (format un peu alambiqué pour coller à tous les cas possibles de votre code actuel, mais je pense que cela est simplifiable)

    En ne passant plus en paramètre le séparateur mais une expression régulière qui match avec les séparateurs possibles comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    m_soundtrack = lire_paireCleValeur_depuisFichierTxt(nomFichier, L"[[:blank:]]\\:[[:blank:]]" );
    Le code de la fonction "lire_paireCleValeur_depuisFichierTxt" serait :

    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
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur_pattern)
    {
        std::string contenuFichier{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
     
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
     
        contenuFichier = std::string(istreambuf_iterator<char>{fichier}, {});
     
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
     
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
        converti += L'\n';
     
        std::size_t pos = converti.length();
     
        if (pos == std::wstring::npos)
            return clevaleurs;
     
        const std::wregex line_format_rg{ L"^(.+?)?((" + separeteur_pattern + L")(.*))|(…|\\.\\.\\.)|(.+)$" };
     
        for (std::wsregex_iterator it{ converti.begin(), converti.end(), line_format_rg }, end{}; it != end; ++it) {
            auto entry = *it;
            if (entry[5].matched)
            {
                clevaleurs.push_back(std::make_pair(L"…", L""));
            }
            else if (entry[1].matched)
            {
                if (entry[4].matched)
                {
                    clevaleurs.push_back(std::make_pair(entry[1].str(), entry[4].str()));
                }
                else
                {
                    clevaleurs.push_back(std::make_pair(entry[1].str(), L""));
                }
            }
            else
            {
                if (entry[4].matched)
                {
                    clevaleurs.push_back(std::make_pair(L"", entry[4].str()));
                }
                else
                {
                    if (entry[6].matched)
                    {
                        clevaleurs.push_back(std::make_pair(entry[6].str(), L""));
                    }
                }
            }
        }
     
        return clevaleurs;
    }

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

    Réponse au message du "20/09/2024, 10h02"

    Les espaces devant "VOD Orange" viennent des lignes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (match[filename_stream_index].matched)
    {
        m_streaming = match[filename_stream_index];
    }
    dans la fonction/constructeur "InfosVisionnage_film::InfosVisionnage_film".
    "filename_stream_index" devrait être égale à 12, pas à 11.
    Vérifiez votre code.

    Vous avez supprimé la structure "SequenceVisionnage_film" et enrichi la structure "InfosVisionnage_film".
    Pour être "logique", vous devriez renommer votre structure "InfosVisionnage_film" en "SequenceVisionnage_film" car elle ne contient que des informations sur les séquences de visionnages, contrairement à "InfosVisionnage" des séries.

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

    Réponse au message du "20/09/2024, 20h46".

    Arrêtez vos bricolages, réglez le "problème" à la source. (cf. début de la réponse au message du "20/09/2024, 10h02")

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

    Réponse au message du "20/09/2024, 22h24"

    cf. ma réponse au message du "19/09/2024, 23h16".

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

    Réponse au message du "22/09/2024, 22h47"

    film_serie.cpp :
    ...
    Ok ou pas ?
    PAS OK => KO

    Pourquoi ces "m_" en préfixe des noms de paramètre, BORDEL.

    Pourquoi faire si compliqué ???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Print_Catalogue(const std::wstring <s>m_</s>sur, std::vector<std::wstring>& <s>m_</s>catalogue, bool affichage_catalogue_actif, std::wstring& keyColor, std::wstring& <s>m_</s>valuesColor)
    {
            std::wstring sur_str;
            for (auto c : catalogue)
            {
                if (c != sur)
                {
                    sur_str += keyColor + c + L" : " + valuesColor + L"Oui" + keyColor + L" !" + valuesColor + L"\r\n";
                }
            }
            std::wcout << sur_str;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wstring recuperer_Max_SJ(fs::path const& cheminFichier, std::vector<std::wstring>& m_catalogue)
    Votre fonction fait 2 choses qui n'ont rien à voir l'une avec l'autre.
    Séparez-les en 2 fonctions distinctes.

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

    https://regex101.com/r/x0Ymmb/2 : marche pas !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt2(std::wstring const& nomFichier, std::wstring separeteur)
    {
        std::string contenuFichier{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
    
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
    
        contenuFichier = std::string(istreambuf_iterator<char>{fichier}, {});
    
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
    
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
        converti += L'\n';/*L"\r\n"*/;
    
        std::size_t pos = converti.length();
    
        if (pos == std::wstring::npos)
            return clevaleurs;
    
        
    //    std::wregex filename_pattern{ L"(.+?)(?:\\.\\((?:(\\d{4})\\-(\\d{2})\\-(\\d{2})\\s*([^\\)]*))\\))?(?:\\.(.+))?$" };
        std::wregex filename_pattern{ L"^((.+[ ][:][ ].+)|(.+[ ][:][ ])|([ ][:][ ].+)|(.+))$" }; 
        std::wstring nom = L"", role = L"";
        std::wsmatch match;
    
        std::regex_match(converti, match, filename_pattern);
    
        while (pos = converti.find(L"\n"/*L"\r\n"*/))
        {
            if (converti[0] != converti.length())
            {
                nom = (match[0].matched) ? match[0].str() : L"";
    //            separeteur = (match[1].matched) ? match[1].str() : L"";
                role = (match[2].matched) ? match[2].str() : L"";
                clevaleurs.push_back(std::make_pair(nom, role));
                nom = L"";
                role = L"";
            }
            else
                break;
        }
        return clevaleurs;
    }
    nom et role : marche pas !

    Problème ?

    Merci d'avance

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 258
    Points : 12 471
    Points
    12 471
    Par défaut
    Vous devez faire attention à la partie "MATCH INFORMATION" à droite de l'interface.
    Vous n'utilisez pas les bons indices et vous avez oublié de capturer les informations dont vous avez besoin.
    Mais vous avez pris la peine de "simplifier" l'expression régulière, c'est bien.
    Vous ne "gérez" pas les cas "..." et "…" avec votre expression régulière.
    Votre expression régulière est simple mais cela rend l'utilisation des résultats plus verbeux.

    https://regex101.com/r/bFH1LN/1

    Votre boucle "while" est complètement aux fraises. (pas de gestion des passage à la ligne suivante, etc...).

    Utilisez la boucle for que j'ai donné
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for (std::wsregex_iterator it{ converti.begin(), converti.end(), line_format_rg }, end{}; it != end; ++it)
    {
    ...
    }
    ET FAITES GAFFE AUX NOMS DES VARIABLES, BORDEL.

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

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

    film_serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void initialiser_Avec(fs::path const& cheminFichier, std::vector<std::pair<std::wstring, std::wstring>>& m_avec)
    {
        auto nomFichier = cheminFichier.filename().wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        m_avec = lire_paireCleValeur_depuisFichierTxt2(cheminFichier.wstring(), L" : ");
        assert((m_avec.size() != 0));
    }
    utils.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt2(std::wstring const& nomFichier, std::wstring separeteur)
    {
        std::string contenuFichier{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
     
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
     
        contenuFichier = std::string(istreambuf_iterator<char>{fichier}, {});
     
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
     
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
        converti += L'\n';/*L"\r\n"*/;
     
        std::size_t pos = converti.length();
     
        if (pos == std::wstring::npos)
            return clevaleurs;
     
        std::wregex line_format_rg{ L"^(?:(?:(.+?) : (.+))|(?:(.+?) : )|(?: : (.+))|(.+))$" };
        for (std::wsregex_iterator it{ converti.begin(), converti.end(), line_format_rg }, end{}; it != end; ++it)
        {
            if(converti[0] != converti.length())
            {
                if (converti[0] == L'.' && converti[1] == L'.' && converti[2] == L'.')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                if (converti[0] == L'')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                if (converti[0] == L'')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                if (converti.size() != 0)
                {
                    std::wsmatch match = *it;
                    std::wstring nom = match[1].str();
                    std::wstring role = match[2].str();
                    clevaleurs.push_back(std::make_pair(nom, role));
                }
                else
                {
                    break;
                }
            }
        }
        return clevaleurs;
    }
    et :
    Andor.[2022- Disney+]
    ... ???

    Je suis fatigué !!! (Le sport)

    Merci beaucoup

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 258
    Points : 12 471
    Points
    12 471
    Par défaut
    "..." et "…", c'est des motifs, il est donc plus logique de les mettre dans l'expression régulière plutôt que de "fabriquer" un bout de code pour les trouvez "à la main".
    (Attention à l'ordre des motifs dans l'expression régulière, cela pilote l'ordre d'évaluation des sous-expressions => les priorités)

    Vous avez, semble-t-il, bien regardé la partie "MATCH INFORMATION", mais que la partie "Match 1" ; mais pas les parties "Match 2" et suivantes, sinon, vous auriez vu que l'indice de la capture qui vous intéresse change en fonction du "motif" trouvé.
    C'est en cela que votre expression régulière "simple"
    rend l'utilisation des résultats plus verbeux.
    Pourquoi les lignes 39 à 43 dans le code de votre dernier post sont dupliquées avec les lignes 44 à 48 ?

    C'est quoi ces "return" en plein milieu d'une boucle, sachant qu'il à le même effet que le "break" ???
    Pourquoi sortir "instantanément" de la fonction quand on trouve un "…" au lieu de vérifier que c'est bien la dernière ligne du fichier ???
    Tous vos tests sont sur la variable "converti", qui ne change pas durant toute la durée de la boucle. Ils sont donc tous totalement faux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(converti[0] != converti.length())
    Ce test a encore moins de sens que les autres.
    Quel rapport entre la longueur de la chaine et le "code" du premier caractère de la chaine ???

    Votre code alambiqué vous colle une paire {"",""} à la fin de votre variable "clevaleurs" parce que vos tests sont complètement foireux.

    Pourquoi ne pas vous être inspiré du code que j'ai posté le "25/09/2024, 13h17' qui est, me semble-t-il, bien plus simple ???

    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
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt2(std::wstring const& nomFichier)
    {
        std::string contenuFichier{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
     
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
     
        contenuFichier = std::string(istreambuf_iterator<char>{fichier}, {});
     
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
     
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
     
        std::wregex line_format_rg{ L"^(?:(?:(.+?) : (.+))|(?:(.+?) : )|(?: : (.+))|(\\.\\.\\.|…)|(.+))$" };
     
        for (std::wsregex_iterator it{ converti.begin(), converti.end(), line_format_rg }, end{}; it != end; ++it) {
            auto entry = *it;
            if (entry[5].matched)
            {
                clevaleurs.push_back(std::make_pair(L"…", L""));
                break;
            }
            else if (entry[1].matched)
            {
                std::wstring nom = entry[1].str();
                std::wstring role = entry[2].str();
                clevaleurs.push_back(std::make_pair(nom, role));
            }
            else if (entry[3].matched)
            {
                std::wstring nom = entry[3].str();
                clevaleurs.push_back(std::make_pair(nom, L""));
            }
            else if (entry[4].matched)
            {
                std::wstring role = entry[4].str();
                clevaleurs.push_back(std::make_pair(L"", role));
            }
            else if (entry[6].matched)
            {
                std::wstring nom = entry[6].str();
                clevaleurs.push_back(std::make_pair(nom, L""));
            }
        }
        return clevaleurs;
    }
    (Le paramètre "separeteur" ne sert à rien ici, car vous ne l'avez pas utilisé pour construire l'expression régulière, contrairement à mon exemple.)

    P.S.: Quand vous testez du nouveau code, arrangez-vous pour que les données en entré correspondent à tous les cas à gérer.
    ".\Andor.[2022- Disney+]\2022-09-21\Avec.txt" ne contient pas les types de ligne gérées par la partie "(?:_(.+?) : )|(?: : (.+))" de l'expression régulière.

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

    https://github.com/laurentbouleau/Exemple : Septembre 13 (28/09/2024)
    Avant : L"..." : ok !

    utils.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt2(std::wstring const& nomFichier, std::wstring separeteur)
    {
        std::string contenuFichier{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
     
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
     
        contenuFichier = std::string(istreambuf_iterator<char>{fichier}, {});
     
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
     
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
        converti += L'\n';/*L"\r\n"*/;
     
        std::size_t pos = converti.length();
     
        if (pos == std::wstring::npos)
            return clevaleurs;
     
        std::wregex line_format_rg{ L"^(?:(?:(.+?) : (.+))|(?:(.+?) : )|(?: : (.+))|(.+))$" };
        for (std::wsregex_iterator it{ converti.begin(), converti.end(), line_format_rg }, end{}; it != end; ++it)
        {
            if(converti[0] != converti.length())
            {
                std::wsmatch match = *it;
                if (match[0] == L"...")
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                if (match[0] == L'')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                if (match[0] == match[1])
                {
                    std::wstring nom = match[1].str();
                    clevaleurs.push_back(std::make_pair(nom, L""));
                }
                if (converti.size() != 0)
                {
                    std::wstring nom = match[1].str();
                    std::wstring role = match[2].str();
                    clevaleurs.push_back(std::make_pair(nom, role));
                }
                else
                {
                    break;
                }
            }
        }
        return clevaleurs;
    }
    Merci

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

    utils.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier)
    {
        std::string contenuFichier{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
    
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
    
        contenuFichier = std::string(istreambuf_iterator<char>{fichier}, {});
    
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
    
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
    
        std::wregex line_format_rg{ L"^(?:(?:(.+?) : (.+))|(?:(.+?) : )|(?: : (.+))|(\\.\\.\\.|…)|(.+))$" };
        const auto etc = L"…";
        const auto x_zero = L"";
        for (std::wsregex_iterator it{ converti.begin(), converti.end(), line_format_rg }, end{}; it != end; ++it) 
        {
            auto entry = *it;
            if (entry[5].matched)
            {
                clevaleurs.push_back(std::make_pair(etc, x_zero));
                break;
            }
            else if (entry[1].matched)
            {
                std::wstring nom = entry[1].str();
                std::wstring role = entry[2].str();
                clevaleurs.push_back(std::make_pair(nom, role));
            }
            else if (entry[3].matched)
            {
                std::wstring nom = entry[3].str();
                clevaleurs.push_back(std::make_pair(nom, x_zero));
            }
            else if (entry[4].matched)
            {
                std::wstring role = entry[4].str();
                clevaleurs.push_back(std::make_pair(x_zero, role));
            }
            else if (entry[6].matched)
            {
                std::wstring nom = entry[6].str();
                clevaleurs.push_back(std::make_pair(nom, x_zero));
            }
        }
        return clevaleurs;
    }
    Problème : x_zero = L"";

    Merci beaucoup

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

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

    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
    const void Film::Print_Avec_etc()
    {
        if (affichage_avec_etc_actif && m_avec.size())
        {
            std::wstring avec_str = m_keyColor[0] + L"Avec : " + m_valuesColor;
            int i = 0;
            for (auto&& [nom, role] : m_avec)
            {
                if (nom == L"…" || nom == L"...")
                    break;
                if (i < m_avec.size() && nom != L"")
                    avec_str += nom;
                i++;
                if (i > 2)
                    break;
                avec_str += m_keyColor[0] + L", " + m_valuesColor;
            }
            avec_str += L"\r\n";
            std::wcout << avec_str;
        }
    }
    Ok ou pas ?

    Merci

  11. #891
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    692
    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 : 692
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Septembre 16 (28/09/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
    const void Serie::Print_Avec_etc()
    {
        if (affichage_avec_etc_actif && saisons.back().m_avec.size())
        {
            std::wstring avec_str = m_keyColor[0] + L"Avec : " + m_valuesColor;
            int i = 0;
            for (auto&& [nom, role] : saisons.back().m_avec)
            {
                if (nom == L"…" || nom == L"...")
                    break;
                if (i < saisons.back().m_avec.size() && nom != L"")
                    avec_str += nom;
                i++;
                if (i > 2)
                    break;
                avec_str += m_keyColor[0] + L", " + m_valuesColor;
            }
            avec_str += L"\r\n";
            std::wcout << avec_str;
        }
    }
    Ok ou pas ?

    Merci

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 258
    Points : 12 471
    Points
    12 471
    Par défaut
    x_zero = L"";
    Ça veut dire quoi ???
    Si c'est une chaine vide, "empty_string" serait plus logique.

    Vous définissez des constantes dans la fonction "lire_paireCleValeur_depuisFichierTxt" mais vous devez vous en servir dans la fonction "Film:rint_Avec_etc".
    Vous devriez la définir à un endroit "accessible" à ces 2 fonctions.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const void Film::Print_Avec_etc()
    C'est quoi ce "const" ???
    Pourquoi faire une nouvelle fonction à la place de "void Film:: Print_Avec" ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (nom == L"…" || nom == L"...")
    Pourquoi "..." ??? Vous avez factorisé le traitement des différentes manières d'encoder une fin de liste dans "lire_paireCleValeur_depuisFichierTxt", pourquoi vous compliquez la vie ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (affichage_avec_etc_actif && saisons.back().m_avec.size())
    "saisons" peut être vide.
    "m_avec.size()" n'est pas un booléen.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
            int i = 0;
            for (auto&& [nom, role] : m_avec)
            {
                if (nom == L"…" || nom == L"...")
                    break;
                if (i < m_avec.size() && nom != L"")
                    avec_str += nom;
                i++;
                if (i > 2)
                    break;
                avec_str += m_keyColor[0] + L", " + m_valuesColor;
            }
    Eviter de tripatouiller l'indice de boucle au milieu de la boucle.

    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
    void Film::Print_Avec_etc()
    {
        if (affichage_avec_etc_actif && m_avec.size()>0)
        {
            std::wstring avec_str = m_keyColor[0] + L"Avec : " + m_valuesColor;
            int item_count = 0;
            for (auto&& [nom, role] : m_avec)
            {
                if (nom == L"…")
                    break;
                if (nom != L"")
                {
                    if (item_count>0)
                    {
                        avec_str += m_keyColor[0] + L", " + m_valuesColor;
                    }
                    avec_str += nom;
                    item_count++;
                    if (item_count > 2)
                        break;
                }
            }
            avec_str += L"\r\n";
            std::wcout << avec_str;
        }
    }
    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
    void Serie::Print_Avec_etc()
    {
        if (affichage_avec_etc_actif && saisons.size()>0 && saisons.back().m_avec.size()>0)
        {
            std::wstring avec_str = m_keyColor[0] + L"Avec : " + m_valuesColor;
     
            int item_count = 0;
            for (auto&& [nom, role] : saisons.back().m_avec)
            {
                if (nom == L"…")
                    break;
                if (nom != L"")
                {
                    if (item_count > 0)
                    {
                        avec_str += m_keyColor[0] + L", " + m_valuesColor;
                    }
                    avec_str += nom;
                    item_count++;
                    if (item_count > 2)
                        break;
                }
            }
            avec_str += L"\r\n";
            std::wcout << avec_str;
        }
    }

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

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

    Ok, merci beaucoup !!!

    Par contre : exemple.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int wmain(int argc, wchar_t* argv[])
    {
    ...
        Person p;
    ...
            film.get_Pernson(Person p);
            film.Print();
    ...
    }
    Problème !!!
    Comprendre pas !!!

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Avec un séparateur " : " en dur et en utilisant des expressions régulières :
    https://regex101.com/r/uvW5k5/1
    (format un peu alambiqué pour coller à tous les cas possibles de votre code actuel, mais je pense que cela est simplifiable)
     
    En ne passant plus en paramètre le séparateur mais une expression régulière qui match avec les séparateurs possibles comme :
    ...
    Le code de la fonction "lire_paireCleValeur_depuisFichierTxt" serait :
    Ok !!!

    InfosVisionnage_film ===> SequenceVisionnage_film
    Ok !

    Les espaces devant "VOD Orange" viennent des lignes :
    ...
    dans la fonction/constructeur "InfosVisionnage_film::InfosVisionnage_film".
    "filename_stream_index" devrait être égale à 12, pas à 11.
    Vérifiez votre code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        const int filename_someFlag_index = filename_date_day_day_index + 2;
        const int filename_stream_index = filename_someFlag_index + 2;
    Pas compris ?

    Pourquoi ces "m_" en préfixe des noms de paramètre, BORDEL.
    Ok !

    Pourquoi faire si compliqué ???
    Marche pas !!!

    Votre fonction fait 2 choses qui n'ont rien à voir l'une avec l'autre.
    Séparez-les en 2 fonctions distinctes.
    ???

    Je suis crevé !

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

    Merci

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

    https://github.com/laurentbouleau/Exemple : Octobre 02 (02/10/2024)

    Pourquoi ces "m_" en préfixe des noms de paramètre, BORDEL.

    Pourquoi faire si compliqué ???
    ...
    Votre fonction fait 2 choses qui n'ont rien à voir l'une avec l'autre.
    Séparez-les en 2 fonctions distinctes.
    et
    void Print_Catalogue(const std::wstring sur, std::vector<std::wstring>& catalogue, bool affichage_catalogue_actif, std::wstring& keyColor, std::wstring& valuesColor)
    Ok !

    Merci beaucoup

  16. #896
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    692
    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 : 692
    Points : 0
    Points
    0
    Par défaut
    https://github.com/laurentbouleau/Exemple : Octobre 03 (02/10/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
    void Serie::Print_Header() const
    {
        if (affichage_titres_actif)
        {
            std::wstring titres_str;
            std::wstring crochet_ouvrant_str = m_keyColor[0] + L" [" + m_valuesColor;
            std::wstring annees_str;
            std::wstring sur_str;
            std::wstring crochet_fermant_str = m_keyColor[0] + L"]" + m_valuesColor;
            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();
                // sur
                if (affichage_sur_actif)
                {
                    if (m_sur == L"Disney+" || m_sur == L"Netflix" || m_sur.size() != 0)
                    {
                        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 if (m_sur == L"Netflix")
                        {
                            sur_str += L" Netflix " + m_keyColor[1] + L": " + m_valuesColor + m_netflix_sj;
                        }
                        else
                        {
                            sur_str += L' ' + m_sur;
                        }
                    }
                }
            }
            // x signalétique jeunesse
            if (affichage_x_sj_actif && (m_sur != L"Disney+" || m_sur != L"Netflix"))
            {
                // 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 << crochet_ouvrant_str << annees_str << sur_str << crochet_fermant_str << x_sj_str << sj_str << duree_str << note_str << std::endl;
        }
    }
    Ok !

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 258
    Points : 12 471
    Points
    12 471
    Par défaut
    get_Pernson ???
    C'est pas plutôt "get_Person", non ?

    C'est quoi une "Person" ?
    Un Acteur ? Un réalisateur ? un Role ? etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            film.get_Pernson(Person p);
    Quand on appelle une fonction, on donne que le nom de la variable, pas le type.
    Mais pour une fonction qui est un "accesseur", c'est plus une signature de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const Person& Film::get_Pernson() const
    On met "const" devant si on considère que le code appelant n'a pas à modifier le comportement de l'objet film via la valeur retournée par la fonction, qui est une référence sur un objet interne à l'instance (donc pas une variable locale à une fonction).
    On met "const" derrière si on considère que la fonction n'a pas le droit de modifier l'état interne (les champs de l'objet) de l'instance.

    Mais l'implémentation de la fonction "Film::get_Pernson(Person p)", c'est plus un "setteur" qu'un getteur. :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Film::set_Pernson(const Person& p)
    Les espaces devant "VOD Orange" viennent des lignes :
    ...
    dans la fonction/constructeur "InfosVisionnage_film::InfosVisionnage_film".
    "filename_stream_index" devrait être égale à 12, pas à 11.
    Vérifiez votre code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const int filename_someFlag_index = filename_date_day_day_index + 2;
        const int filename_stream_index = filename_someFlag_index + 2;
    Pas compris ?

    C'est le constructeur de "SequenceVisionnage_film" qui est utilisé dans le dernier code du dépôt Github et plus le constructeur de "InfosVisionnage", donc les constantes ont des valeurs différentes que lors de mes précédentes remarques.
    Ces constantes sont là pour savoir ce que devrait contenir chaque capture de l'expression régulière (capture = (x.x.x)).

    Dans la boucle while :

    La valeur de la variable "dates_format" est :
    ((([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2}))(_?))

    Si la variable "dates_str" est égale à "2018-05-01 VOD Orange" :
    dates_match[0/dates_full_match_index] : c'est l'ensemble de tout ce qui est capturable => 2018-05-01 VOD Orange
    dates_match[1/xxxxxxxxxxxxxxxxxxxx] : c'est ce qui est capturé par () => 2018-05-01 VOD Orange
    dates_match[2/xxxxxxxxxxxxxxxxxxxx] : c'est ce qui est capturé par () => 2018-05-01 VOD Orange
    dates_match[3/dates_date_year_month_day_year_index] : c'est ce qui est capturé par () => 2018
    dates_match[4/dates_date_year_month_day_month_index] : c'est ce qui est capturé par () => 05
    dates_match[5/dates_date_year_month_day_day_index] : c'est ce qui est capturé par () => 01
    dates_match[6/dates_date_month_day_month_index] : c'est ce qui est capturé par () => (rien)
    dates_match[7/dates_date_month_day_day_index] : c'est ce qui est capturé par () => (rien)
    dates_match[8/dates_date_day_day_index] : c'est ce qui est capturé par () => (rien)
    dates_match[9/xxxxxxxxxxxxxxxxxxxxxxx] : c'est ce qui est capturé par () => (rien)
    dates_match[10/dates_someFlag_index] : aucune capture "()" ne correspond à la valeur 10 => (rien)

    Vous devriez faire le ménage dans les constantes dans la fonction "SequenceVisionnage_film::SequenceVisionnage_film", il y en a partout (oui, c'est un peu de ma faute avec mes exemples qui décortiquent un peu le procédé).
    Beaucoup ne correspondent à rien (cf. dates_someFlag_index) ou sont même fausses (cf. filename_stream_index ci-après).
    Quand vous modifiez les expressions régulières, il faut systématiquement corriger ces constantes.
    Il y a moyen de faire en sorte d'utiliser des "noms" à la place des numéros d'ordre, mais il faut que vous compreniez le concept de capture avant ça, et c'est pas encore dans le C++ "standard", je crois.
    https://regex101.com/r/ZWx27Q/1 pour un exemple d'utilisation.
    Mais les indices utilisés dans la boucle "while" semblent correctes, mais si vous utilisez d'autres constantes, vous aurez des "surprises".

    Maintenant avec l'expression régulière "filename_format_rg" :
    (((([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2}))(_?))+)(\s(.+))?

    Si la variable "str" est égale à "2018-05-01 VOD Orange" :
    match[11/filename_stream_index] : c'est ce qui est capturé par () => "_VOD Orange"
    match[12/xxxxxxxxxxxxxxxxxxxx] : c'est ce qui est capturé par () => "VOD Orange"

    Votre constante "filename_stream_index" est égale à 11 donc le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (match[filename_stream_index].matched)
    {
        m_streaming = match[filename_stream_index];
    }
    fait que la variable "m_streaming" contient "_VOD Orange" et non "VOD Orange".
    Donc, si votre constante "filename_stream_index" aurait été égale à 12, le résultat aurait été "correcte".

    Je vous laisse vérifier que les autres constantes "filename_stream_xxx" sont "bonnes".
    Quand vous modifiez les expressions régulières, il faut systématiquement corriger ces constantes.(bis)

    Pourquoi faire si compliqué ???
    Marche pas !!!
    Pour rappel, il s'agit de la fonction "Print_Catalogue".
    Je viens de tester le code sur la version "Septembre 18 (30/09/2024)" et cela fonctionne "parfaitement".
    Pouvez-vous me donner un exemple où cela ne "marche" pas ?
    Pour moi, si cela ne "marche" pas, le code original non plus.

    Votre fonction fait 2 choses qui n'ont rien à voir l'une avec l'autre.
    Séparez-les en 2 fonctions distinctes.
    ???
    C'est lié à la fonction "recuperer_Max_SJ".
    Pourquoi une personne qui lirait un code qui appelle cette fonction "recuperer_Max_SJ" devrait être conscient que cela modifie le paramètre "m_catalogue" ???
    Utilisez 2 fonctions différentes, une pour récupérer le "Max_SJ" et une autre pour ajouter votre "bidule" à votre liste de "machin".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Serie::Print_Header() const
    {
    ...
    }
    Attention aux accès hors limites dans les std::vector, SVP :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    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];
    Il se passe quoi si "m_titres.size()" est égale à 0.
    m_titres[0] =>BOUM
    Il se passe quoi si "m_titres.size()" est égale à 2.
    m_titres[2] =>BOUM

    "crochet_ouvrant_str" et "crochet_fermant_str", pourquoi c'est des variables locales et pas une constantes (statique de la classe Serie, par exemple) ?
    Le nom des variables locales, c'est vraiment pas top.

    Votre code est extrêmement complexe, peu lisible (on ne "voit" pas le format des chaines de caractères qui seront affichées dans la console).
    Beaucoup trop de chaines de caractère en dur.S'il y a une nouvelle plateforme de streaming en plus de "Disney+" et "Netflix", ça sera l'enfer. (Quid de "Max", etc...)
    Beaucoup trop de copier-coller.
    Elle devrait être découpée en plusieurs parties.
    Des conditions qui n'ont aucun sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (m_sur == L"Disney+" || m_sur == L"Netflix" || m_sur.size() != 0)
    C'est la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (affichage_x_sj_actif && (m_sur != L"Disney+" || m_sur != L"Netflix"))
    C'est la même chose que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (affichage_x_sj_actif)
    Car "(m_sur != L"Disney+" || m_sur != L"Netflix")", c'est toujours vrai.

    Vous avez plein de champs différents comme "m_disney_sj", "m_netflix_sj", etc... qui rendent le code casse-gueule.
    Si vous devez stocker des informations spécifiques à chaque plateforme de streaming, utilisez plutôt un champ dans la classe Serie de type :
    std::map<std::wstring,ClasseDeStockageDesInformationsDeLaPlateformeDeStreaming> m_streamingInfos;
    Avec "ClasseDeStockageDesInformationsDeLaPlateformeDeStreaming" une classe permettant de stocker les informations spécifiques à la plateforme de streaming, comme son "SJ".
    Et le "std::wstring", le type de la clé de la map, le nom de la plateforme de streaming.
    Si, pour l'instant, vous ne stockez que le "SJ" d'une plateforme, "ClasseDeStockageDesInformationsDeLaPlateformeDeStreaming" pourrait être remplacé par un simple "std::wstring".

    Pourquoi "affichage_sur_actif" ne fonctionne que si "affichage_annees_actif" est vrai ???
    Pourquoi "affichage_sur_actif" et "affichage_annees_actif" ne fonctionnent que si "affichage_titres_actif" est vrai ???
    etc...
    Pourquoi c'est si complexe ????

    Pourquoi pas juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Serie::Print_Header() const
    {
        std::wstring titres_str = calcul_Titres_Affichage();
        std::wstring annees_str= format_Annees();
        std::wstring sur_str = calcul_Sur_Affichage();
        std::wstring anneesEtSur_str = format_AnneesEtSur(annees_str, sur_str);
        // les 3 lignes du dessus peuvent être remplacées par un truc comme "std::wstring anneesEtSur_str  = calcul_AnneesEtSur_Affichage()";
        std::wstring signaletique_jeunesse_str = calcul_signaletique_jeunesse_affichage();
       std::wstring duree_str = calcul_duree_affichage();
       std::wstring note_str = calcul_Note_Affichage();
     
       std::wcout << titres_str << anneesEtSur_str << signaletique_jeunesse_str << duree_str << note_str << std::endl;
    }

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

    Exemple.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct Person
    {
        std::wstring m_h = L"h";
        std::wstring m_min = L"min";
        //                                    (bleu)         (vert)                 (rouge)                (jaune)
        std::vector<std::wstring> m_keyColor{ L"\x1b[94;1m", L"\x1b[38;2;0;255;0m", L"\x1b[38;2;255;0;0m", L"\x1b[38;2;255;255;0m"};
        std::wstring m_valuesColor = L"\x1b[38;2;255;255;255m"; // Blanc
    };
    Exemple.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int wmain(int argc, wchar_t* argv[])
    {
    ...
        Person p;
    ...
            film.set_Person(p);
            film.Print();
        }
    ...
    }
    film.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    struct Person;
    ...
    class Film
    {
    ...
        void set_Person(Person& p);
    ...
    };
    film.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Film::set_Person(Person& p)
    {
        m_h = p.m_h;
        m_min = p.m_min;
        m_keyColor = p.m_keyColor;
        m_valuesColor = p.m_valuesColor;
    }
    Nom : Capture d’écran 2024-10-03 133621.png
Affichages : 71
Taille : 26,7 Ko
    Comment faire ???

    Merci beaucoup

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 258
    Points : 12 471
    Points
    12 471
    Par défaut
    En modifiant le code à partir de la version "Octobre 03 (02/10/2024)" du dépôt GitHub, je n'ai aucun problème de compilation (à l'exécution, le code n'utilise pas ces lignes avec le jeu de données utilisées)

    C'est donc d'autres modification qui pose problèmes.
    C'est quoi vos ligne 113 et 143 de votre "Exemple.cpp" SVP ? (Ou les lignes correspondant aux messages d'erreur)

  20. #900
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    692
    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 : 692
    Points : 0
    Points
    0
    Par défaut
    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
        Person p;
    
        bool found = false;
    
        std::size_t pos, pos2;
        const std::wstring d_p1 = L".(";
        pos = nomDossier.find(d_p1);
        const std::wstring d_p2 = L")";
        pos2 = nomDossier.find(d_p2);
        const std::size_t c_annee_size = 4;
        const std::size_t c_mois_size = 2;
        const std::size_t c_jour_size = 2;
        const std::size_t c_tiret_size = 1;
    
        std::wregex nomDossier_pattern{ L"(.+?)(?:\\.\\((?:(\\d{4})\\-(\\d{2})\\-(\\d{2})\\s*([^\\)]*))\\))?(?:\\.(.+))?$" };
    
        std::wsmatch match;
        if (!found && pos > 2 && pos2 > (pos + c_annee_size + c_tiret_size + c_mois_size + c_tiret_size + c_jour_size) && pos != std::wstring::npos && pos2 != std::wstring::npos && 
            std::regex_match(nomDossier, match, nomDossier_pattern))
        {
            static Film film(racine);
            found = true;
            for (const auto& entry_film : fs::directory_iterator((film.getRacine())))
            {
                if (entry_film.is_regular_file())
                {
                    film.initialiser_Fichier(entry_film);
                }
            }
            //film.set_Person(const Person& p);
            film.set_Person(p);
            film.Print();
        }
    C'est quoi vos ligne 113 et 143 de votre "Exemple.cpp" SVP ? (Ou les lignes correspondant aux messages d'erreur)
    Voilà !!!

+ 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