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. #701
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonsoir,

    Attends :
    https://github.com/laurentbouleau/Exemple : Juin 07 (09/06/2024)

    m_cheminFichier ===> cheminFichier : ok !
    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
    void Saison::initialiser_Numero(fs::path const& cheminFichier)
    {
        auto nomFichier = cheminFichier.filename().wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        std::size_t pos;
        m_numero = std::stoi(nomFichier, &pos);
        try
        {
            m_resume = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
        }
        catch (runtime_error const& exception)
        {
            std::wcout << L"Erreur : " << exception.what() << std::endl;
        }
        assert((m_resume.size() != 0));
    }
    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
    ...
        if (m_serie.m_resume != m_resume)
        {
            for (auto r : m_resume)
                saison_str += r;
        }
        else
        {
            std::wstring wstr;
            if (m_resume[0].size() < 40)
            {
                wstr = m_resume[0];
     
            }
            else
            {
                wstr = m_resume[0].substr(0, 40) + L"...";
            }
            saison_str += wstr + keyColor[1] + L'(' + valuesColor + L"Bis" + keyColor[1] + L')' + valuesColor;
        }
    ...
    Merci

  2. #702
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 642
    Par défaut
    La fonction "Saison::initialiser_Numero(fs::path const& cheminFichier)" est un cas pathologique qui montre que vous vous compliquez la vie.
    Vous faites beaucoup trop de choses dans une fonction, et son nom ne colle pas avec ses actions.

    "Saison::initialiser_Numero" n'est appelé que dans "Saison::initialiser_Fichier":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if (int j = std::stoi(nomFichier))
    {
        initialiser_Numero(cheminFichier);
        return;
    }
    (Il y a bien d'autres problème dans la fonction "Saison::initialiser_Fichier".)

    On voit que le numéro de "saison" est déjà connu univoquement dans la variable "j".
    (Oui, la gestion du numéro "0" pour une saison, c'est mort, chelou)

    Donc, on peut simplifier et renommer avec des noms "correctes" la partie de la la fonction "Saison::initialiser_Fichier":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (int j = std::stoi(nomFichier))
    {
        m_numero = j;
        initialiser_Resume(cheminFichier);
    }
    else
    {
    ...
    }
    et simplifier "Saison::initialiser_Numero" (en la renommant aussi "Saison::initialiser_Resume"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void Saison::initialiser_Resume(fs::path const& cheminFichier)
    {
        m_resume = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
     
        assert((m_resume.size() != 0));
    }
    (Après, moi, je suis pas sûr du assert car j'ai pas l'impression que c'est une erreur du développeur.)

    Pour le 2ème bout de code, beaucoup trop de valeurs en dur, qui gèrent mal les longueurs (une chaine de 40 caractères de long sortira avec 40 + 3 +1+3+1 caractères "imprimables"), etc...
    C'est un code qui n'annonce pas explicitement ce qu'il est censé faire. Le format de sortie de la chaine n'est pas visible dans son ensemble.
    Les mécanismes qui tronquent sont tellement commun que si vous ne trouvez pas de fonction toute faite, il serait préférable que vous en construisiez une plutôt qu'avoir ce machin dans 20 parties du code.

    https://en.cppreference.com/w/cpp/utility/format/format

  3. #703
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonjour,

    Juin 08 (09/06/2024)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    La fonction "Saison::initialiser_Numero(fs::path const& cheminFichier)" est un cas pathologique qui montre que vous vous compliquez la vie.
    Vous faites beaucoup trop de choses dans une fonction, et son nom ne colle pas avec ses actions.
    ...
    (Après, moi, je suis pas sûr du assert car j'ai pas l'impression que c'est une erreur du développeur.)
    Ok : Noté !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ...        if (int j = std::stoi(nomFichier))
            {
                m_numero = j;
                initialiser_Resume(cheminFichier);
                return;
            }
    ...
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void Saison::initialiser_Resume(fs::path const& cheminFichier)
    {
        m_resume = lire_fichierTxt(cheminFichier.wstring(), { L"\n" });
        assert((m_resume.size() != 0));
    }
    Après :
    https://en-cppreference-com.translat...r&_x_tr_pto=sc
    Pouvez-vous expliquer ?

    Par exemple : serie.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<typename ... Args>
    std::wstring wstring_format(const std::wstring& format, Args ... args)
    {
        int size_s = _snwprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
        if (size_s <= 0) { throw std::runtime_error("Error during formatting."); }
        auto size = static_cast<size_t>(size_s);
        std::unique_ptr<wchar_t[]> buf(new wchar_t[size]);
        _snwprintf(buf.get(), size, format.c_str(), args ...);
        return std::wstring(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
    }
    Ok ou pas ?

    Merci

  4. #704
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 642
    Par défaut
    Evitez les "return" au milieu des fonctions.

    "wstring_format", c'est du même acabit que "std : format".
    Si possible, évitez la traduction, c'est beaucoup moins compréhensible après traduction.

  5. #705
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonjour,

    Evitez les "return" au milieu des fonctions.
    Ok ! Noté !

    "wstring_format", c'est du même acabit que "std : format".
    Ok !

    Si possible, évitez la traduction, c'est beaucoup moins compréhensible après traduction.
    Comment faire ?
    Nom : Capture d’écran 2024-06-11 100432.png
Affichages : 241
Taille : 53,5 Ko
    std::format ? (Formatting library (since C++20) · ‎Std::format_to · ‎Standard format specification)
    ou
    Traduire cette page ?

    Et :
    Formatting library (since C++20) · ‎Std::format_to · ‎Standard format specification

    https://en.cppreference.com/w/cpp/utility/format/format : Je ne sais plus comment faire !

    Merci

  6. #706
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 642
    Par défaut
    "wstring_format", c'est du même acabit que "std : format".
    Je crois que j'ai dit une grosse connerie.
    "wstring_format" n'utilise pas la même syntaxe que "std::format".
    "wstring_format" utilise une syntaxe proche du "printf du C".
    "wstring_format", c'est une rustine pour combler un manque de "std::format" en C++17, qui a été comblé en C++20.
    Mais c'est une rustine.

    Si vous voulez restez en C++17.
    Vous pouvez utiliser cette rustine de "wstring_format".

    Pour un exemple d'utilisation de la rustine, regardez du côté de la fonction "SequenceVisionnage:: Print_Dates_de_visionnage".

    Le but principal, c'est d'expurger les valeurs en dur et de séparer le calcul des valeurs à afficher des valeurs liées à la mise en page/forme.
    La mise en forme doit être facilement modifiable, via des fichiers de configurations, par exemple.
    Donc, sans valeurs en dur. Changer la limite de 40 caractères ou le marqueur de troncature (ici "...") doivent être modifiable indépendamment l'un de l'autre.
    Remplacer "(Bis)" par autre chose ne devrait pas changer le code, ni la mise en page.
    Etc...

    Vous restez en C++17 ou vous passez à C++20 ?

  7. #707
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    C++17 : ok !
    Après 20++, mais plus tard !!!

  8. #708
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonjour,

    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
    ...
    const std::vector<std::wstring> Sous_Genre
    {
        L"Animation",
        L"Documentaire",
        L"Docu-séries",
        L"Manga",
        L"Mini-série"
    };
    ...
    bool initialiser_Sous_Genre(std::wstring& m_s_g)
    { // Sous_Genre
        bool s_g = false;
        if (std::find(::Sous_Genre.begin(), ::Sous_Genre.end(), m_s_g) != ::Sous_Genre.end())
            s_g = true;
        return s_g;
    }
    ...
    Et :
    exemple.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
        Serie serie(racine);
        serie.initialiser_Dossier(racine);
    ...
    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
    ...
    void Serie::initialiser_Dossier(fs::path const& cheminFichier)
    {
        auto nomDossier = cheminFichier.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
    ...
        bool found = false;
    ...
        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 ?
    Exemple :
    m_sous_genre = L"Manga";
    ou
    m_sous_genre = L"";
    ou
    m_sous_genre = L"Blablabla"; // Erreur !!!

    Merci

  9. #709
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 642
    Par défaut
    C++17 : ok !
    Ok, alors, si vous maitrisez les format de printf du C, vous devriez savoir vous servir de la fonction "wstring_format", non ? (cf. la fonction "SequenceVisionnage:: Print_Dates_de_visionnage" comme exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...bool initialiser_Sous_Genre(std::wstring& m_s_g)
    Cette fonction n'initialise rien.
    Et cette fonction ne fait que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool estDans = std::find(::Sous_Genre.begin(), ::Sous_Genre.end(), sous_genre) != ::Sous_Genre.end()
    Comme cette fonction n'est pas utilisée dans le projet, on ne sait pas ce qu'elle est vraiment censée faire.
    => code mort ?
    Logiquement, ça devrait s'appeler "Sous_Genre::IsValid".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ...
        Serie serie(racine);
        serie.initialiser_Dossier(racine);
    ...
    Pourquoi faire cela en 2 appels et pas juste 1 ?
    "Serie::initialiser_Dossier" fait bien plus qu'"initialiser un dossier", il est capable de construire tout l'objet, donc autant faire tout cela dans le constructeur.

    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::initialiser_Dossier(fs::path const& cheminFichier)
    {
    ...
        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;
        }
    ...
    }
    C'est difficile de vous suivre sans "spécifications".
    Mais pourquoi toujours tout faire d'un bloc ?

    Si je dois faire un truc complexe, j'y vais étape par étape.
    ici:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
        if (sous_genre.at(pos) != std::wstring::npos)
        {
            sous_genre = sous_genre.substr(pos + 2);
        }
        else
        {
            sous_genre  = L"";
        }
        m_sous_genre = Sous_Genre::get(sous_genre,genre_principal);
    ...
    }
    Comme ça, s'il y a un sous genre par défaut, comme ""(rien), ou qu'il faut gérer des problèmes de sensibilité à la casse, d'abréviation, de globalisation/traduction etc..., tout cela sera dans les fonctions de "Sous_Genre".
    Moi, je ferais de "Sous_Genre" un espace de nom qui contiendra tout le nécessaire à la gestion des "Sous Genre".
    Aidez-vous vous-même, en créant des fonctions de bas niveau simples et pratique, que les fonctions de plus haut niveau pourront facilement utilisées (donc une fonction ne fait qu'une chose, et elle l'annonce dans son nom.).

  10. #710
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonsoir,

    Juin 09 (12/06/2024) : Juin 09 (12/06/2024)

    Nom : Capture d’écran 2024-06-12 221438.png
Affichages : 225
Taille : 66,1 Ko

    Pas fais (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
    void Saison::Print()
    {
    ...
        else
        {
            std::wstring wstr;
            if (m_resume[0].size() < 40)
            {
                wstr = m_resume[0];
            }
            else
            {
                wstr = m_resume[0].substr(0, 40) + L"...";
            }
            saison_str += wstr + keyColor[1] + L'(' + valuesColor + L"Bis" + keyColor[1] + L')' + valuesColor;
        }
    ...
    }
    Et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const void Serie::Print_Note(int I, int x)
    {
    ...
    }
    Pas fais !

    Je suis crevé !!!

    Mais :
    exemple.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int wmain(int argc, wchar_t* argv[])
    {
    ...
        Serie serie(racine);
        serie.initialiser_Dossier(racine);
    ...
    }
    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
    void Serie::initialiser_Dossier(fs::path const& cheminFichier)
    {
        auto nomDossier = cheminFichier.filename().wstring();
        assert(nomDossier.length() > 0 && L"Nom de dossier vide");
        //assert(nomDossier.length() > 9 && L"Nom de fichier trop court pour avoir au moins une date");
        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)
        {
            exit(1);
        }
        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 ?
    Aujourd'hui, 15h52
    Exemple : m_sous_genre ???
    Après, moi seuls : m_titres2, std::wstring textes, m_dates2, m_sur !!

    Merci d'avance

  11. #711
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonjour,

    Vous : Mercredi 12/06/2024 à 22h46 !
    Moi : Mercredi 12/06/2024 à 22h46 !
    Ah ! Mince !!! Ok !
    Notés !!!

    Sous_Genre::IsValid : ok !

    Mais (26/05/2024, 02h43) :
    Le principe des expressions régulière est de trouver un motif dans une chaine de caractère.
    Mais un motif est souvent composé de "sous-motifs".
    Dans le code à base d'appels à la fonction "std::string::find", que vous mettez un peu partout malheureusement, qui cherchait à déterminer les titres (originaux cf. la fonction "initialiser_Titre_Original"), j'ai déduit que la ligne contenant le ou les titres était formée de 3 parties (=> sous-motifs):
    ...
    Comme*(___)*apparait avant la partie "séparateurs",*(.+?)*indique donc*tout ce qui est avant les séparateurs éventuels.
    Dure a dire !
    Pouvez-vous expliquer étape par étape ?

    Merci

  12. #712
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 642
    Par défaut
    J'ai l'impression que mes réponses vous bloquent un peu.

    Vous pouvez toujours enchaîner les "+=" mais on manque d'une vue d'ensemble du format de sortie de l'objet.
    En faisant tous les calculs intermédiaires pour avoir les informations, puis construire la sortie d'un bloc permet de savoir quel est le format de sortie car il est explicitement donné à la fin.
    Avoir le format en un bloc permet aussi de le modifier pour qu'il s'adapte à des modifications dynamiques, comme la taille de l'écran/console ou de la langue d'affichage.

    Exemple avec "Saison:: Print" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    std::wstring stringFormatOneLine(std::wstring str, int lengthMax, std::wstring marqueurTroncature, int marqueurTroncature_len, std::wstring suffixe, int suffixe_len)
    {
        std::wstring res;
    
        if (str.size() < lengthMax - suffixe_len)
        {
            res = str;
        }
        else
        {
            res = str.substr(0, lengthMax - marqueurTroncature_len - suffixe_len) + marqueurTroncature;
        }
        res += suffixe;
        return res;
    }
    
    void Saison::Print_Header()
    {
        wchar_t date_tab[15];
        std::wcsftime(date_tab, 15, L"%d/%m/%Y", &m_dossier.first);
        std::wstring date_tab_str = date_tab;
    
        std::wstring date_str = date_tab_str.substr(0, 2) + keyColor[1] + L'/' + valuesColor + date_tab_str.substr(3, 2) + keyColor[1] + L'/' + valuesColor + date_tab_str.substr(6, 4);
    
        std::wstring dossier_str;
        if (m_dossier.second != L"")
            dossier_str = keyColor[0] + m_dossier.second + valuesColor + L' ';
    
        std::wstring titre_str;
        if (m_titres.size() != 0)
        {
            titre_str = keyColor[0] + m_titres[0] + valuesColor;
            if (m_titres.size() > 1)
            {
                titre_str += keyColor[1] + m_titres[1] + valuesColor + keyColor[0] + m_titres[2] + valuesColor;
            }
            titre_str += keyColor[1] + L" : " + valuesColor;
        }
    
        std::wstring resume_str;
        if (m_serie.m_resume != m_resume)
        {
            for (auto r : m_resume)
                resume_str += r;
        }
        else
        {
            resume_str = stringFormatOneLine(m_resume.size() > 0 ? m_resume[0] : L"", 40 + 3 + 5, L"...", 3, keyColor[1] + L'(' + valuesColor + L"Bis" + keyColor[1] + L')' + valuesColor, 5);
        }
    
        std::wstring numero_str = L' ' + keyColor[1] + L'(' + valuesColor + std::to_wstring(m_numero) + keyColor[1] + L')' + valuesColor;
    
        std::wcout << date_str << dossier_str << keyColor[1] + L" : " + valuesColor << titre_str << resume_str << numero_str << std::endl;
    }
    
    void Saison::Print()
    {
        Print_Header();
    
        // Chaîne
        Print_Chaine();
        // Netflix
        Print_Netflix();
        // Avec
        Print_Avec();
        // Images(s)
        Print_Images();
        // Saison ok !
        std::wcout << L"\r\n";
    }
    J'ai regroupé les actions qui affichent le début d'une saison dans une fonction "Saison:: Print_Header", c'est pas logique de séparer cette partie mais comme "Print_Chaine", "Print_Netflix", etc.. existent déjà.
    Avec ces fonctions, on n'a pas une vue d'ensemble "précise" de l'affichage d'une saison, mais "Saison:: Print_Header" donne comment avoir une vue d'ensemble de la partie "supérieure" de l'affichage d'une saison.
    Cette vue d'ensemble est la dernière ligne de cette fonction.
    On voit comment les "champs" s'enchainent et le formatage de l'affichage sera sur cette ligne, et pas ailleurs.
    Chaque partie du calcul des données à afficher dispose de ces variables dédiées, pour pas tout mélanger.
    J'en profite pour ajouter une fonction de bas niveau : "stringFormatOneLine" (nom un peu foireux, mais j'ai mimiqué votre manière de formater l'affichage qui ne me semble pas très "logique").
    En ajoutant ces fonctions "utilitaires" votre code sera plus concis, plus claire et plus facile à faire évoluée.
    Le but de cette fonction est de permettre un affichage avec un taille variable de caractère, un marqueur de troncature paramétrable et un suffixe aussi paramétrable.

    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const void Serie::Print_Note(int I, int x)
    {
    ...
    }
    C'est quoi le paramètre "I" ? le paramètre "x" ?
    Il faut correctement nommer les choses, SVP.
    Si l'on décortique le code que vous avez mis en commentaire, "I" c'est une clé dans un tableau associatif, comme si on pouvait avoir plusieurs "notes".
    Mais la définition du champ m_note dans la classe "Serie" est un double, donc rien à voir avec un tableau associatif (std::map ou autre).
    Il faut commencer par savoir ce qu'est "vraiment" une ou des notes.
    "x" semble un vieux truc pour configurer l'endroit de l'affichage. Clairement, faudrait quelque chose de plus explicite.
    Il faut que vous spécifiiez votre besoin (comment le ou les notes doivent s'afficher dans la console, par exemple). Essayer de faire "comme avant" c'est reproduire les mêmes erreurs qui rendent le code im-maintenable.

    Dure a dire !
    Pouvez-vous expliquer étape par étape ?
    Pour les expressions régulières, il faut savoir découper la chaine en parties logiques indépendantes, puis trouver comment exprimer ces parties avec la syntaxe "expression régulière".

    Donner un exemple de chaine, spécifiez ses différentes parties (comment elles sont séparées, etc...), puis essayez de nous donner une expression régulière qui permet de distinguer ces parties, OK ?

  13. #713
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonsoir,

    Ça ne fonctionne pas !

    Exemple : (std::accumulate(...))
    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
    #include "pch.h"
    
    #include "Exemple.h"
    #include "film_serie.h"
    #include "serie.h"
    
    // C :
    #include <io.h>
    #include <fcntl.h>
    #include <stdio.h>
    // C++
    #include <windows.h>
    #include <cassert>
    //#include <cstddef>
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <vector>
    #include <map>
    //#include <stdio.h>
    #include <locale>
    #include <algorithm>
    #include <codecvt>
    #include <sstream>
    //#include <tuple>
    #include <regex>
    
    #include <filesystem> // C++17 standard header file name
    ...
    const std::wstring Serie::Print_Note()
    {
        if (affichage_note_actif)
        {
            bool found = false;
            std::vector<double>d;
            for (const auto& s : saisons)
            {
                if (s.m_note != -1.0)
                {
                    found = true;
                    d.push_back(s.m_note);
                }
            }
            if (!found)
                return L' ' + keyColor[0] + L'(' + valuesColor + L"pas de note !" + keyColor[0] + L')' + valuesColor;
            else
            {
                double n = std::accumulate(d.begin(), d.end(), 0.0) / d.size();
                std::wstring m_note_str = std::to_wstring(n);
                if (m_note_str[2] == L'0')
                    m_note_str = m_note_str[0];
                else if (m_note_str[3] == L'0')
                    m_note_str = m_note_str[0] + keyColor[0] + m_note_str[1] + valuesColor + m_note_str[2];
                else
                    m_note_str = m_note_str[0] + keyColor[0] + m_note_str[1] + valuesColor + m_note_str[2] + m_note_str[3];
                m_note_str = L' ' + m_note_str + keyColor[0] + L"/5" + valuesColor;
                return m_note_str;
    
            }
        }
    }
    ...
    Comment faire ?

    Nom : Capture d’écran 2024-06-13 230127.png
Affichages : 210
Taille : 18,3 Ko

    Juin 10 (14/06/2024)

    Merci

  14. #714
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonjour,

    std::accumulate(...) : Ok !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ...
    #include <numeric>
    ...

    Merci

  15. #715
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonjour,

    https://github.com/laurentbouleau/Exemple : Juin 11 (15/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
    ...
    struct Saison
    {
    ...
        double m_note = -1.0;
    ...
    };
     
    class Serie
    {
    ...
        std::wstring m_netflix_sj;
        double m_note = 0.0;
        std::wstring m_sj;
        std::wstring m_sous_genre;// {};
        std::wstring m_sur;
    ...
    };
    Nom : Capture d’écran 2024-06-15 133407.png
Affichages : 201
Taille : 94,4 Ko

    Voilà ! Ça fonctionne !

    Maintenant : void Saison:: Print_Header()

    Merci

  16. #716
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonjour,

    https://github.com/laurentbouleau/Exemple : Juin 12 (16/06/2024)
    Ok !

    Mais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    void Saison::initialiser_Note(fs::path const& cheminFichier)
    { // 0...5 ou -1
        auto nomFichier = cheminFichier.filename().wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
     
        std::wstring n = lire_fichierTxt(cheminFichier.wstring());
        std::size_t pos = n.length();
        if (n == L"")
        {
            m_note = -1.0;
            return;
        }
        if (pos != 1 && pos != 3)
        {
            //E.afficher_X(-1, n, L"Pas de [a-z] et/ou [0-9] et/ou etc…");
            return;
        }
        if (!iswdigit(n[0]))
        {
            //E.afficher_X(-1, n, L"Pas de [a-z] et/ou etc…");
            return;
        }
        if (!(n[0] == L'0' || n[0] == L'1' || n[0] == L'2' || n[0] == L'3' || n[0] == L'4' || n[0] == L'5'))
        {
            //E.afficher_X(-1, n, L"Pas de [0-5]");
            return;
        }
        if (pos == 1)
        {
            m_note = std::stod(n);
        }
        else
        {
            if ((n[1] == L',' || n[1] == L'.') && iswdigit(n[2]) && pos == 3)
            {
                //
                n[1] = L',';
                //
                // Ok !!!
                m_note = std::stod(n);
            }
            else
            {
                //E.afficher_X(-1, n, L"Pas de…");
            }
        }
    }
    Pouvez-vous corriger ?

    Après :
    • std::wstring m_titres2; ===> void Serie::initialiser_Titre2(...)
    • std::wstring m_dates2; ===> void Serie::initialiser_Dates(...)
    • std::wstring m_sous_genre; ===> void Serie::initialiser_Sous_Genres(...)
    • std::wstring m_sur; ===> void Serie::initialiser_Sur(...)

    Expliquez-moi !

    Merci

  17. #717
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 642
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wstring Serie::Print_Note()...
    Nommez correctement vos fonction.
    Votre "Serie:: Print_Note" n'imprime/affiche rien, alors pourquoi l'appeler "Serie:: Print_Note" ???
    Faites l'affichage dedans, ou appelez la différemment.

    Comme déjà indiqué, l'utilisation des "+=" rend la lecture du format de sortie peu lisible.
    Et on évite les tests d'égalité avec des nombres à virgule flottante.
    Une proposition :
    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
    #include <string_view>
    ...
    static bool ends_with(std::wstring_view str, std::wstring_view suffix)
    {
        return str.size() >= suffix.size() && str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
    }
    ...
    const std::wstring Serie::Calcul_Note_Affichage()
    {
        std::wstring res;
    
        std::vector<double>notes;
        for (const auto& saison : saisons)
        {
            if (saison.m_note >= 0.0)
            {
                notes.push_back(saison.m_note);
            }
        }
        if (notes.size() < 1)
            res = keyColor[0] + L'(' + valuesColor + L"pas de note !" + keyColor[0] + L')';
        else
        {
            double note = std::accumulate(notes.begin(), notes.end(), 0.0) / notes.size();
            double whole, fractional;
            fractional = std::modf(note, &whole);
    
            std::wstring whole_str = wstring_format(L"%.0f", whole);
            std::wstring fractional_tmp = wstring_format(L"%.2f", fractional);
            std::wstring sepDecimal = fractional_tmp.substr(1, 1);
            std::wstring fractional_str;
            if (ends_with(fractional_tmp, L"00"))
            {
                fractional_str = L"";
            }
            else if (ends_with(fractional_tmp, L"0"))
            {
                fractional_str = fractional_tmp.substr(2, 1);
            }
            else
            {
                fractional_str = fractional_tmp.substr(2, 2);
            }
    
            res = whole_str + keyColor[0] + sepDecimal + valuesColor + fractional_str + keyColor[0] + L"/5";
        }
        return (res.length() > 0) ? L" " + res + valuesColor : L"";
    }
    La partie verte est facilement transférable dans une fonction dédiée.
    Le format de la chaine en sortie est, je trouve, plus explicite.

    Pour "Saison::initialiser_Note" :
    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
    void Saison::initialiser_Note(fs::path const& cheminFichier)
    { // 0...5 ou -1
        auto nomFichier = cheminFichier.filename().wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
     
        std::wstring str = lire_fichierTxt(cheminFichier.wstring());
     
        std::wregex note_pattern{ L"([0-5])((\\.|,)(\\d+))?" };
        std::wsmatch match;
        if (std::regex_match(str, match, note_pattern))
        {
            if (match[2].matched)
            {
                str[1] = L',';
            }
     
            m_note = std::stod(str);
        }
    }

  18. #718
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    Bonsoir,

    https://github.com/laurentbouleau/Exemple : Juin 13 (16/06/2024)

    J'ai marche !!! Ok !

    --------------------------
    void Serie::initialiser_Dossier(fs::path const& cheminFichier) ===> Serie::Serie(std::filesystem::path racine) !!!
    Ok !!!

    Mais, je suis crevé !

    Après :
    • std::wstring m_titres2; ===> void Serie::initialiser_Titre2(...)
    • std::wstring m_dates2; ===> void Serie::initialiser_Dates(...)
    • std::wstring m_sous_genre; ===> void Serie::initialiser_Sous_Genres(...)
    • std::wstring m_sur; ===> void Serie::initialiser_Sur(...)


    Merci

  19. #719
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    A propose :
    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

    Merci

  20. #720
    Membre éclairé Avatar de Laurent_B_
    Homme Profil pro
    Ingénieur de déploiement réseaux
    Inscrit en
    Avril 2021
    Messages
    786
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    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 : 786
    Par défaut
    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 ???

    Merci

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

Discussions similaires

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

Partager

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