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. #521
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Marne (Champagne Ardenne)

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

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

    https://github.com/laurentbouleau/Exemple : Février 24

    Faut se décider.
    Oui, c'est vrai ! Mais (serie.h) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        std::vector<std::tuple<unsigned int, unsigned int, std::vector<DateRecord>, std::wstring, bool>>episode;
        std::vector<std::tuple<unsigned int, std::wstring, std::wstring, std::wstring, std::tm, std::wstring>> episode_titre;
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    const void Serie::PrintEpisodes(Saison saison)
    {
        if (affichage_Episodes_actif /* && dates.size() > 0*/)
        {
            wchar_t date_string[15];
            std::size_t taille;// , taille2;
            taille = std::size(saison.episode);
            std::wstring wstr;
            std::tm tm;
            int j = 0;
            for (int i = 0; i < taille; i++)
            {
                std::tuple<unsigned int, unsigned int, std::vector<DateRecord>, std::wstring, bool>& e = saison.episode[i];
                std::tuple<unsigned int, std::wstring, std::wstring, std::wstring, std::tm, std::wstring>& e_t = saison.episode_titre[j];
                wstr = L"";
                wstr += std::to_wstring(get<0>(e)) + keyColor[1] + L'x' + valuesColor;
                wstr += std::to_wstring(get<1>(e));
                //
                wstr += keyColor[1] + L" : " + valuesColor;
                if (get<4>(e))
                {
                    std::wstring t2 = get<2>(e_t);
                    if (t2 == L"")
                        wstr += keyColor[1] + get<1>(e_t) + valuesColor;
                    else
                        wstr += keyColor[1] + get<1>(e_t) + valuesColor + get<2>(e_t) + keyColor[1] + get<3>(e_t) + valuesColor;
                    // Temps
                    tm = get<4>(e_t);
                    wstr += keyColor[1] + L" (" + valuesColor + std::to_wstring(tm.tm_min) + keyColor[1] + min + L')';
                }
                // L" : "
                wstr += keyColor[1] + L" : " + valuesColor;
                //
                std::wcout << wstr << std::endl;
                if (get<4>(e))
                {
                    PrintEpisode_Titre(e_t);
                }
                if (get<1>(e) != get<0>(e_t))
                    j++;
            }
        }
    }
     
    const void Serie::PrintEpisode_Titre(std::tuple<unsigned int, std::wstring, std::wstring, std::wstring, std::tm, std::wstring>& e_t)
    {
        if (affichage_Episode_Titre_actif)
        {
            std::wstring wstr = get<5>(e_t);
            std::wcout << wstr << std::endl;
        }
    }
    Pas terminer, mais ok !

    const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::vector<std::wstring> separeteurs)
    et
    const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::vector<std::wstring> separeteurs, bool f)
    Pas ok, mais bon !

    Je suis crevé !!!

    Merci

    (std::wcout << L"zzz" << std::endl)

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous ne tenez pas compte de mes remarques et vous vous retrouvez avec des montagnes de codes complexes et piégeux.

    La fonction "Serie:: PrintEpisodes(Saison saison)" illustre bien de problème.

    Elle utilise 2 index de boucles (i et j) donc leur fonction est obscure et à la mécanique opaque.
    C'est dû à l'utilisation de champs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        std::vector<std::tuple<unsigned int, unsigned int, std::vector<DateRecord>, std::wstring, bool>>episode;
        std::vector<std::tuple<unsigned int, std::wstring, std::wstring, std::wstring, std::tm, std::wstring>> episode_titre;
    Qui ne devrait en être qu'un, d'un type bien plus facile que des "std::tuple" à la chaine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     std::vector<Episode> m_episodes;
    "Episode" serait une nouvelle classe en charge de regrouper les informations sur un épisode. (Comme Serie qui regroupe les informations d'une série et Saison qui regroupe les informations d'une saison)
    Je pense que le nombre d'informations à stocker pour un épisode justifie largement la création d'une classe "Episode", qui sera très simple.
    Vous n'avez qu'à changer le code qui manipule ces 2 champs (episode et episode_titre) pour qu'il manipule m_episodes à la place.

    En utilisant une classe comme "Episode" le code de "Serie:: PrintEpisodes(Saison saison)" se résumerait à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const void Serie::PrintEpisodes(Saison saison)
    {
        for (auto ep : saison.m_episodes)
        {
            ep.afficher();
        }
    }
    (Pas de "affichage_Episodes_actif", car j'estime que ce n'est pas à la fonction d'affichage de décider s'il faut afficher ou pas mais le code appelant ce type de fonction.)
    C'est juste une boucle sur m_episodes, car la fonction actuelle ne fait aucun habillage spécifique à la Serie ou à la saison.

    La mise en forme de l'affichage est noyée dans des "+=" à la chaine au lieu d'utiliser des "std::format".
    "std::format", c'est du C++20 mais votre projet est en C++17 et le passage en C++20 montre des incompatibilité avec le C++20.
    Généralement, cela indique des faiblesses dans le code.

    Il serait pertinent de passer votre projet en C++20 ou supérieur et corriger ces incompatibilités.
    A la place "std::format", vous pouvez toujours utiliser des wstring intermédiaire pour que cela soit plus lisible.
    [CODEstd::wstring prefixe_part = ...
    wstring main_part = ...

    std::wcout << prefixe_part << ... << main_part << ...
    [/CODE]

    Mention spéciale pour "wchar_t date_string[15]", un tableau à la C à éviter comme la peste dans du code C++ "moderne".
    Vous déclarez une ribambelle de variables hors de la boucle, c'est dangereux, à éviter aussi.
    Ici, aucune n'est utile (sauf i et j qui sont casse-gueule et facilement évitables avec un type de données adapté( cf. La classe Episode évoquée dans les paragraphes précédents))

    "Serie:: PrintEpisodes(Saison saison)" n'a aucun lien directe avec la série mais uniquement la saison, elle ne devrait donc pas être une fonction de la classe Serie mais une fonction de la classe Saison.

    Donc "Serie:: PrintEpisodes(Saison saison)" => "Saison:: PrintEpisodes()"
    Le code de "Saison:: PrintEpisodes()" serait encore plus simple et la fonction plus facile à utiliser (car plus "logiquement" placée dans les types).

    Les "get<x>(..)", c'est illisible.
    Prenez la peine d'utiliser des variables intermédiaires pour rendre votre code lisible :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    std::wstring titre = get<3>(e_t);
    std::tm date_diffusion = get<4>(e_t);
    ...
    Mais l'utilisation d'un classe Episode devrait dégager tous ces "get<>" foireux.

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

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

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

    Mardi : Orthophoniste et kiné : toujours !!! Alors, je suis fatigué !

    Pas à pas !!!

    Merci

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Créez une classe Episode et remplacez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<std::tuple<unsigned int, unsigned int, std::vector<DateRecord>, std::wstring, bool>>episode;
        std::vector<std::tuple<unsigned int, std::wstring, std::wstring, std::wstring, std::tm, std::wstring>> episode_titre;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Episode> episodes;
    Et remplacez le code qui initialise/modifie/utilise les champs "Saison::episode" et "Saison::episode_titre" pour qu'il initialise/modifie/utilise le champ "Saison::episodes".

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

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

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

    Je m'arrive pas !!!

    Nom : Capture d’écran 2024-02-28 172932.png
Affichages : 132
Taille : 20,1 Ko
    ???

    https://github.com/laurentbouleau/Exemple/ : Février 26

    Et c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wchar_t date_string[15];
    Ok !!!

    Mais C++ :
    https://en.cppreference.com/w/cpp/header/chrono
    ???

    Merci beaucoup

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

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

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Je m'arrive pas !!!

    Mince !!!

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

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

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const void Serie::PrintEpisodes(Saison saison)
    {
        for (auto ep : saison.episodes)
        {
            ep.afficher();
        }
    }
    ===>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void Saison::afficher_Episode(fs::path const& cheminFichier)
    {
        auto nomFichier = cheminFichier.filename().wstring();
     
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        afficher(cheminFichier, saison); // saison ??? ou afficher() ???
        //m_episode.push_back(make_tuple(x, e, dr, streaming, found, t1, t2, t3, tm_temps, t[2]));
        //episodes.push_back(episoode);
        episodes.push_back(Episode); // Episode
    }
    Je comprends pas !!!

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

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

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    ep.afficher() : ben non !!!
    ep.Print() ??? oui ou non ?

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

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

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

    https://github.com/laurentbouleau/Exemple : Février 27

    Nom : Capture d’écran 2024-02-29 133606.png
Affichages : 112
Taille : 23,7 Ko
    4 erreurs !!!

    Merci

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous avez 2 versions avec le même tag "Février 27" et je n'ai "que" 3 erreurs et non 4 avec ces versions.

    Votre code ne correspond pas à ce qu'il y a dans le dépôt Github.

    Je ne peux donc pas résoudre les problèmes sur votre version mais uniquement sur la version correspondant à la seconde version (les 2 versions "Février 27" et les 2 dernières des 3 versions taguées "Février 26" sont identiques au niveau des sources).
    (Faudrait gérer les versions de manière plus rigoureuse, sinon, on s'en sortira pas.)

    Je vais donc donner la "solution" pour "Février 26" parce que votre version de "Février 27" qui donne 4 erreurs, on ne l'a pas. (Mais les messages d'erreurs sont explicites, vous devez avoir les moyens de les corriger par vous-même, non ?)

    GitHub\Exemple\serie.cpp(608,20): error C2660: 'Saison::afficher'*: la fonction ne prend pas 2 arguments
    Ligne 608 de serie.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /*episoode = */afficher(cheminFichier, saison);
    La déclaration de cette fonction dans serie.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void afficher(std::filesystem::path const& cheminFichier);
    La fonction "Saison::afficher" ne prend donc qu'un paramètre et pas 2.
    Comme vous appelez un fonction non statique d'une classe, vous n'avez pas besoin de passer l'instance de classe (l'objet) en argument, car la fonction connait l'instance implicitement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /*episoode = */afficher(cheminFichier/*, saison*/);

    Erreur suivante :
    GitHub\Exemple\serie.cpp(610,24): error C2065: 'episoode'*: identificateur non déclaré
    Ligne 610 de serie.cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    episodes.push_back(episoode);
    Là, c'est aussi "normal", vous utilisez la variable "episoode" que vous déclarez nulle part.

    Ici, on est encore devant une illustration du fait que mal nommer les choses rend les choses inutilement complexes.
    "Saison::afficher_Episode(fs::path const& cheminFichier)" n'a rien à voir avec l'affichage d'un épisode mais tout avec la création d'un objet épisode dans une saison.
    Donc renommer la méthode "Saison::afficher_Episode" et "Saison::Creer_Episode" (nom temporaire), aussi bien dans serie.h que dans serie.cpp (pensez à séparer les classes dans des fichiers différents, SVP)
    Changer le code de "Saison::Creer_Episode" pour qu'elle fasse ce qu'elle annonce :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void Saison::Creer_Episode(fs::path const& cheminFichier)
    {
        auto nomFichier = cheminFichier.filename().wstring();
     
        assert(nomFichier.length() > 0 && L"Nom de fichier vide");
        Episode episode(cheminFichier);
        episodes.push_back(episode);
     
    }
    (Ici, on prend un chemin vers un fichier pour initialiser un épisode, c'est peut-être pas bon, mais c'est un début de conception qui sépare enfin la création des objets de leur "affichage".)

    On se retrouve avec l'erreur suivante :
    \GitHub\Exemple\serie.cpp(608,21):
    1> 'Episode::Episode(const Episode &)'*: impossible de convertir l'argument 1 de 'const std::filesystem::path' en 'const Episode &'
    C'est parce qu'il vous faut un constructeur d'Episode qui prend en paramètre en chemin:
    Ajouter la ligne suivante à la déclaration de la classe Episode dans serie.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Episode
    {
        Episode(void);
        Episode(std::filesystem::path const& cheminFichier){};
        ~Episode();
    ...
    Il reste une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GitHub\Exemple\serie.cpp(887,11): error C2660: 'Episode::afficher'*: la fonction ne prend pas 0 arguments
    Ligne 887 de serie.cpp:
    Code de la fonction qui englobe cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const void Serie::PrintEpisodes(Saison saison)
    {
        for (auto ep : saison.episodes)
        {
            ep.afficher();
        }
    }
    Une fonction de la classe Serie qui affiche les épisodes en lui passant une saison en paramètre, c'est pas faux mais c'est pas très logique.
    C'est plutôt un objet Serie qui demande aux objets Saison qu'il contient de s'afficher, et c'est les objets Saison qui demandent aux épisodes que la saison contient de s'afficher.

    Mais bon, on va patcher à l'arrache.

    L'erreur, c'est que vous appelez la fonction "Episode::affiche" sans paramètre mais que vous l'avez déclaré et implémenté avec 2 paramètres :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Episode::afficher(fs::path const& cheminFichier, std::pair<unsigned short int, std::wstring>saison)
    Comme un épisode ne devrait avoir besoin de rien pour d'afficher (si en fait, mais en verra plus tard), vous ne devriez passer aucun paramètre à la fonction "Episode::afficher".
    Donc changez la déclaration de cette fonction dans serie.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct Episode
    {
    ...
        void afficher();
    et son implémentation dans serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void Episode::afficher()
    {...
    Là, le compilateur va hurler quand les anciens arguments "cheminFichier" et "saison" sont utilisés dans le corps de la fonction.

    Comme "saison" n'est utilisé que dans un "try/catch" qui n'a aucun sens et que le type de l'argument saison montre qu'il n'a rien de concret (sinon, ça serait un objet de type Saison et non une obscure "std::pair<unsigned short int, std::wstring>".
    Expliquez à quoi devrait servir ce machin !!!
    En attendant, on fout cette cochonnerie en commentaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     /*try
     {
         if (e <= saison.first)
         {
         }
     }
     catch (std::runtime_error const& exception)
     {
         std::cout << "Erreur : " << exception.what() << std::endl;
     }*/
    (Je suis persuadé qu'il y a plus simple et plus robuste que cette paire "saison" à la con.)

    Il reste l'argument "cheminFichier". Je suppose que ce "cheminFichier" est le même que celui en paramètre de l'ancienne fonction "Serie::afficher_Episode" devenue "Serie::Creer_Episode(fs::path const& cheminFichier)".
    Comme vous l'avez vu avant, ce chemin est passé au constructeur de l'objet "Episode" et on n'en faisait rien.
    On va sauvegarder sa valeur passée en paramètre du constructeur d'un Episode dans un champ de la classe Episode qu'on appellera "m_cheminFichier" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    struct Episode
    {
        Episode(void);
        Episode(std::filesystem::path const& cheminFichier) { m_cheminFichier = cheminFichier; };
        ~Episode();
        void afficher();
    
    
        std::filesystem::path m_cheminFichier;
    };
    (C'est pas très élégant, ni optimal, mais c'est pour vous compreniez l'utilisation "basique" des champs d'une classe)
    Ainsi, dans toutes les fonctions non statiques d'un objet "Episode", vous pourrez accéder à la valeur passée au constructeur de l'objet via l'identifiant "m_cheminFichier" ("m_" pour Membre et ainsi distinguer les champs d'une classe (membre de la classe) des arguments ou variable locale d'une fonction).
    Ainsi, la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> t = lire_fichierTxt(cheminFichier.wstring(), { L"\n" }, false);
    devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> t = lire_fichierTxt(m_cheminFichier.wstring(), { L"\n" }, false);
    Ces 2 simples modifications permettent de rendre le code compilable (pas exécutable car vous avez encore des erreurs d'édition de lien)

    Mais cette fonction "Episode::afficher" reste une horrible usine à gaz que vous devriez rapidement remplacer par l'utilisation d'expressions régulières donc j'ai donné un exemple de code il y a peu dans cette file de message (ici).

    Pour résoudre l'erreur de l'édition de lien :
    serie.obj : error LNK2019: symbole externe non résolu "private: void __cdecl Serie:rintSaison(struct Saison)" (?PrintSai
    Il suffit de décommenter l'implémention de la fonction "Serie:rintSaison" dans serie.cpp (vous ne l'avez pas supprimé ou commenté dans serie.h d'où l'erreur d'édition de lien et pas une erreur de compilation).
    (on est d'accord que cette implémentation est vraiment pas terrible mais si vous l'appelez toujours dans votre code, vous ne pouvez pas la mettre en commentaire sans "sommations")

    Une fois ces erreurs de compilation corrigés "à l'arrache", le lancement d'une session de débugging montre un problème à la ligne 435 d'"Exemple.cpp":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (const auto& entry_serie : fs::directory_iterator((serie.getRacine())))
    Le problème est à la 429 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::wstring racine = t + L"House of Ninjas.[2024 Netflix].Mini-série";
    Vous initialisez racine avec une valeur qui ne correspond à aucun répertoire récupéré via Github.
    Si vous utilisez de nouveau fichier, mettez les dans le dépôt Git.

    Avez-vous bien saisi l'intérêt des champs d'une classe ?

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

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

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

    Vous avez 2 versions avec le même tag "Février 27" et je n'ai "que" 3 erreurs et non 4 avec ces versions.

    Votre code ne correspond pas à ce qu'il y a dans le dépôt Github.
    ...
    Si vous utilisez de nouveau fichier, mettez les dans le dépôt Git.

    Avez-vous bieb saisi l'intérêt des champs d'une classe ?
    Je suis crevé !

    Mais :
    https://github.com/laurentbouleau/Exemple : Février 28 : ok ! Mais...

    Compliqué à lire !!!
    Plus simple et phrases simples !!!

    Exemple :
    Il suffit de décommenter l'implémention de la fonction "Serie:rintSaison" dans serie.cpp (vous ne l'avez pas supprimé ou commenté dans serie.h d'où l'erreur d'édition de lien et pas une erreur de compilation).
    (on est d'accord que cette implémentation est vraiment pas terrible mais si vous l'appelez toujours dans votre code, vous ne pouvez pas la mettre en commentaire sans "sommations")
    Ben...

    Merci mais pas compris, ou presque !!!

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

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

    Informations forums :
    Inscription : Avril 2021
    Messages : 386
    Points : 0
    Points
    0
    Par défaut
    Et :
    Nom : Capture d’écran 2024-02-29 233817.png
Affichages : 105
Taille : 15,6 Ko
    ???
    Fatigué

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Attention, vous avez oublié d'initialiser le champ m_cheminFichier des objets Episode :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Episode(std::filesystem::path const& cheminFichier) {m_cheminFichier =cheminFichier;};
    Votre code compile et fait ce qui vous lui demandé.
    Si vous êtes un peu perdu, n'hésitez pas à utiliser le débogueur en mode pas à pas. (utilisation des points d'arrêt déjà expliqué récemment dans ce file de message)


    Il suffit de décommenter l'implémentation de la fonction "Serie: PrintSaison" dans serie.cpp
    Ligne 746 de serie.cpp, enlever le "/*" en début de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /*const void Serie::PrintSaison(Saison saison)
    Ligne 778 de serie.cpp, enlever le "*/3 en fin de ligne.
    Ligne 11 de serie.h, enlever le "//" en début de ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //const void PrintSaison(Saison saison);
    On n'est bien d'accord sur l'effet de ces 3 modifications : cela "décommente" le fonction "Serie: PrintSaison", OK ?

    Rien ne s'affiche car vous ne demander aucun affichage, malgré l'appel à des "affichexxx" et autre "Printxxx" qui ne font pas ce qu'indique leur noms, on n'en revient toujours au problème de nommage de vos fonctions et champs dans votre code.

    Pour "voir des choses", on peut décommenter la ligne 823 dans serie.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //PrintSaison(saisons[i]);
    Et "Serie: PrintSaison" porte bien son nom, elle tente d'afficher des trucs. Contrairement à la grande majorité des autre fonctions en "affichexxx" et autre "Printxxx".

    Maintenant, si vous lancez le programme, vous avez dans la console :
    15/02/2024 : Des années après une retraite bien méritée d'une formidable vie de ninjas, une famille dysfonctionnelle doit reprendre du service pour faire face à une série de menaces. (8)
    15/02/2024 : Des années après une retraite bien méritée d'une formidable vie de ninjas, une famille dysfonctionnelle doit reprendre du service pour faire face à une série de menaces. (8)
    C'est votre appel à la fonction ""Serie:: Print()" sur l'instance de Seerie "serie" à la ligne 456 de Exemple.cpp : "serie.Print();" qui fait tout l'affichage.
    Si l'affichage ne correspond pas à ce que vous voulez, utilisez le débogueur pour voir où le code ne fait pas ce que vous cherchez à afficher.

    Actuellement, c'est "Serie:: PrintSaison" qui affiche "tout" car vous n'avez qu'une saison dans l'objet "serie".

    Vous avez commenté les lignes 767 à 775, donc c'est "normal" que vous n'avez pas grand-chose d'afficher.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
            //std::size_t taille2;
            //taille2 = std::size(saisons[i].episode);
            //for (int j = 0; j < taille2; j++)
            //{
            //    PrintEpisode();
            //}
     
            // Avec
            //PrintAvec(saisons[i].avec);
    Vous pouvez remplacer toutes ces lignes en commentaire par juste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            PrintEpisodes(saison);
            PrintAvec(saison.avec);
    C'est pas très beau comme code mais cela correspond à la logique des fonctions que vous avez déjà définies.

    Le code ne compilera pas mais je vous laisse voir comment vous réglerez ces problèmes de compilation (puis d'édition de lien).
    Indice : vous avez à déclarer rt définir la fonction "Serie:: PrintAvec".

    Vous appelez la fonction "Serie:: PrintEpisodes" en ligne 751 de serie.cpp, pourquoi si tôt dans "Serie:: PrintSaison" ?
    Ça fait doublon avec le code qui remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //std::size_t taille2;
            //taille2 = std::size(saisons[i].episode);
            //for (int j = 0; j < taille2; j++)
            //{
            //    PrintEpisode();
            //}
    "Serie:: PrintSaison" n'affiche rien de vraiment pertinent car le fonction "Episode:: afficher()" qu'elle appelle est totalement bogué.
    Récrivez "Episode:: afficher()" en utilisant une expression régulière à la place de cette usine à gaz.

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

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

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

    https://github.com/laurentbouleau/Exemple : Mars 01

    Je suis fatigué ! J'en ai marre !

    Merci

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Vous avez toujours beaucoup trop de code, et vos fonctions et champs sont nommée n'importe comment (BORDEL).

    Vous allez vous noyer dans un verre d'eau avec tout ce code inutile, piégeux et mal nommé.

    Je ne sais pas pourquoi vous ne voulez pas faire un peu de refactoring pour ne plus avoir à gérer cette montagne de code.

    Prenez le temps de formuler des questions.

    On va encore jouer aux devinettes pour savoir ce qui vous bloque.

    Je suppose que c'est l'affichage des épisodes qui vous "dérange".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void Episode::Print()
    {
        if (affichage_Print_actif)
        {
            std::wstring wstr;
            wstr = std::to_wstring(x);
            wstr += keyColor[1] + L'x' + valuesColor;
            wstr += std::to_wstring(e);
            wstr += keyColor[1] + L" : " + valuesColor;
            std::wcout << wstr << std::endl;
        }
    }
    Mais le code de cette fonction est, pour moi, correcte, même s'il n'est pas fini, car je suppose que vous ne voulez pas juste afficher les champs "x" et "e" d'un épisode.
    (Vos noms de champs "x" et "e", franchement, vous abusez avec des noms à la con !!!)
    Tous les épisodes affichent "0x0" dans la console, je suppose que ce n'est pas ce que vous attendiez.

    Le problème, c'est que les champs "x" et "e" (ainsi que les autres que vous voudriez afficher) sont initialisés dans la fonction "Episode:: afficher()".
    Cette fonction "Episode:: afficher()" n'affiche rien (je vous ai dit que les noms de vos fonctions sont à chier ? ) mais initialise les champs de l'objet Episode.

    Le plus "logique", c'est transférer tout le code de "Episode:: afficher()" dans le constructeur d'Episode : "Episode:: Episode(std::filesystem::path const& cheminFichier)".
    Pensez à transférer l'implémentation de ce constructeur de "serie.h" à "serie.cpp".
    Pensez aussi à supprimer le constructeur d'Episode sans paramètre et son destructeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Episode
    {
        //Episode(void);
        Episode(std::filesystem::path const& cheminFichier);
        //~Episode();
    ...
    Et pensez à corriger le code que vous allez transférer de "Episode:: afficher()" à "Episode:: Episode(std::filesystem::path const& cheminFichier)" en utilisant des regEx pour que cela soit moins une usine à gaz.

    Tant que vous ne prenez pas le temps de nommer correctement les fonctions/les champs et d'apprendre à utiliser le mode pas-à-pas du débogueur, vous allez tourner en rond.

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

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

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

    regEx : Avant l’A.V.C : oui, je sais !!! Après, j'ai oublié !!!
    https://en.cppreference.com/w/cpp/regex : Comment faire ? Et, l'anglais ! Difficile !!!

    Merci

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Commencez par transférer tout le code de "Episode:: afficher()" à "Episode:: Episode(std::filesystem::path const& cheminFichier)".

    Les RegEx, c'est des classes et fonctions qui permettent de détecter des motifs dans une chaine de caractères.

    Le format d'un nom de fichier est, si je ne me trompe pas, de la forme :
    (numéro de saison)x(numéro de l'épisode).(formules donnant des informations sur la date de diffusion) (nom du stream).(extension de fichier)

    Le but maintenant, est de faire comprendre ce format aux classes de RegEx, pour qu'elles nous aident à trouver chaque partie dans le nom du fichier.

    "[[:digit:]]" indique un chiffre entre 0 et 9.
    Si on ajoute un "+" à la fin, cela signifie une séquence d'au moins un élément.
    Donc "[[:digit:]]+" signifie : une séquence d'au moins un chiffre.
    On met entre parenthèses les éléments qui doivent être extraits de la chaine de caractères.
    Donc un numéro s'exprime donc ainsi : "([[:digit:]]+)".
    Donc, pour extraire le numéro de saison, l'expression régulière commencera par "([[:digit:]]+)".
    Pour un caractère "explicite" (caractère sans signification spécifique), il suffit de le placer à l'endroit où il doit apparaître.
    Donc "([[:digit:]]+)x" correspond au début d'un nom de fichier correspondant au format recherché.
    Le numéro de l'épisode est un nombre de 1 à 3 chiffres.
    "+", c'est pour une séquence arbitraire, mais on peut spécifier le nombre minimum et maximum d'élément de la séquence en utilisant des accolade "{minimum,maximum}".
    Donc pour le numéro de l'épisode le format est "([[:digit:]]{1,3})".

    "([[:digit:]]+)x([[:digit:]]{1,3})" est donc l'expression régulière qui correspond à la partie "(numéro de saison)x(numéro de l'épisode)" du nom du fichier.

    "." a une signification particulière et donc ne peut pas être directement utilisé, comme le "x" séparant le numéro de saison et ne numéro d'épisode.
    Il faut "l'escaper" avec un backslash : "\\." (un \ pour l'escaping de l'expression régulière et un autre \ pour l'escaping du C/C++).

    Et ainsi de suite :
    A la fin, pour toute la partie radicale du nom du fichier, cela donne :
    ([[:digit:]]+)x([[:digit:]]{1,3})\\.(((([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2})-([[:digit:]]{2})|([[:digit:]]{2})))(_?))+)(\\s(.+))?

    Le code de la fonction "Saison:: afficher_Episode" dans le post ici donne un code qui utilise cette formule de manière plus "digeste" et permet de vérifier le format et d'extraire les informations qui nous intéressent.

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

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

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

    https://github.com/laurentbouleau/Exemple : Mars 02

    Question : je n'arrive pas !
    Nom : Capture d’écran 2024-03-05 175848.png
Affichages : 62
Taille : 101,4 Ko
    Réponse ?

    Et le dépôt : Ou qu'il est ?
    (https://github.com/laurentbouleau/Exemple)

    Pendant ce temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ...
    #include <regex>
    ...
     
    void Saison::afficher_Episode(unsigned short int prefixe, fs::path const& cheminFichier)
    {
        const std::wstring numero_saison_format = L"([[:digit:]]+)";
        const std::wstring sep_numero_saison = L"x";
        const std::wstring numero_episode_format = L"([[:digit:]]{1,3})";
        const std::wstring sep_episode_saison = L"\\.";
    Merci d'avance

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

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

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    Question : je n'arrive pas !
    C'est pas très claire comme question.

    Je suppose que c'est le fait de voir affiché 4 fois chacune des 4 saisons.

    C'est tout simplement le code de la fonction " Serie:: PrintSaison(Saison saison)" qui est programmé n'importe comment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
            std::size_t taille;
            taille = std::size(saisons);
            for (auto i = 0; i < taille; i++)
            {
                saison.Print();
            }
    Cette fonction est sensé affiché UNE saison, celle passée en paramètre de la fonction.

    Donc un code plus correct serait :

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

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

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

    Je suis crevé !!!

    https://github.com/laurentbouleau/Exemple : Mars 03

    Moi :
    Nom : Capture d’écran 2024-03-06 223057.png
Affichages : 55
Taille : 72,2 Ko

    Vous :
    Nom : Capture d’écran 2024-03-06 222534.png
Affichages : 51
Taille : 71,3 Ko

    Et : https://www.allocine.fr/series/fiche...rie=32767.html

    D'accord : Problème !!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    Episode::Episode(fs::path const& m_cheminFichier)
    {
        const std::wstring numero_saison_format = L"([[:digit:]]+)";
        const std::wstring sep_numero_saison = L"x";
        const std::wstring numero_episode_format = L"([[:digit:]]{1,3})";
        const std::wstring sep_episode_saison = L"\\.";
     
        const std::wstring date_year_month_day_format = L"([[:digit:]]{4})-([[:digit:]]{2})-([[:digit:]]{2})";
        const std::wstring date_month_day_format = L"([[:digit:]]{2})-([[:digit:]]{2})";
        const std::wstring date_day_format = L"([[:digit:]]{2})";
        const std::wstring stream_format = L"(\\s(.+))?";
        const std::wstring dates_format = L"((" + date_year_month_day_format + L"|" + date_month_day_format + L"|" + date_day_format + L")(_?))";
     
        const int dates_full_match_index = 0;
        const int dates_date_year_month_day_year_index = dates_full_match_index + 3;
        const int dates_date_year_month_day_month_index = dates_date_year_month_day_year_index + 1;
        const int dates_date_year_month_day_day_index = dates_date_year_month_day_month_index + 1;
        const int dates_date_month_day_month_index = dates_date_year_month_day_day_index + 1;
        const int dates_date_month_day_day_index = dates_date_month_day_month_index + 1;
        const int dates_date_day_day_index = dates_date_month_day_day_index + 1;
        const int dates_fucking_someFlag_index = dates_date_day_day_index + 2;
     
        const std::wregex filename_format_rg{ numero_saison_format + sep_numero_saison + numero_episode_format + sep_episode_saison + L"(" + dates_format + L"+)" + stream_format };
     
        const int filename_full_match_index = 0;
        const int filename_numero_saison_index = filename_full_match_index + 1;
        const int filename_numero_episode_index = filename_numero_saison_index + 1;
        const int filename_dates_index = filename_numero_episode_index + 1;
        const int filename_date_year_month_day_year_index = filename_dates_index + 2;
        const int filename_date_year_month_day_month_index = filename_date_year_month_day_year_index + 1;
        const int filename_date_year_month_day_day_index = filename_date_year_month_day_month_index + 1;
        const int filename_date_month_day_month_index = filename_date_year_month_day_day_index + 1;
        const int filename_date_month_day_day_index = filename_date_month_day_month_index + 1;
        const int filename_date_day_day_index = filename_date_month_day_day_index + 1;
        const int filename_fucking_someFlag_index = filename_date_day_day_index + 2;
        const int filename_stream_index = filename_fucking_someFlag_index + 2;
     
     
        auto nomFichier = m_cheminFichier.filename().wstring();
        assert(nomFichier.length() > 0 && L"Nom de fichier Episode vide");
     
        auto stem = m_cheminFichier.stem().wstring();
        //assert((stem.length() > (9 + std::to_wstring(prefixe).length() + sep_numero_saison.length())) && L"Nom de fichier Episode trop court pour avoir au moins une date");
        assert((stem.length() > 9) && L"Nom de fichier Episode trop court pour avoir au moins une date");
     
        assert(isdigit(stem[0]) && L"Nom de fichier Episode ne commençant pas par un nombre");
        unsigned int fucking_x = std::stoi(stem);
        //assert((prefixe == fucking_x && fucking_x <= 1000) && L"x <= 1000 !!!");
        assert((fucking_x <= 1000) && L"x <= 1000 !!!");
        assert((stem.find(L"x", 0) != std::wstring::npos) && L"Saison::afficher_Episode() :  x !!!");
        //assert(((fucking_x >= prefixe)) && L"saison.first != x");
        assert(std::regex_match(stem, filename_format_rg) && L"Le nom du fichier n'est pas valide");
     
        unsigned int fucking_e;
        std::vector<DateRecord> drS;
        std::wstring streaming = L"";
     
        std::wsmatch match;
        auto str = stem;
        //Exemple assez complexe de nom de fichier
        //str = L"1x01.2024-02-01_2024-02-02_02-03_0405 Netflix";
        std::regex_match(str, match, filename_format_rg);
     
        std::wsmatch dates_match;
        auto dates_str = match[filename_dates_index].str();
        while (std::regex_search(dates_str, dates_match, std::wregex{ dates_format }))
        {
            if (dates_match[dates_date_year_month_day_year_index].matched)
            {
                auto year = std::stoi(dates_match[dates_date_year_month_day_year_index]);
                auto month = std::stoi(dates_match[dates_date_year_month_day_month_index]);
                auto day = std::stoi(dates_match[dates_date_year_month_day_day_index]);
     
                assert(checkyear(year));
                assert(checkmonth(month));
                assert(checkday(month, day, year));
     
                DateRecord dr{ {0,0,0,day,month - 1,year - 1900} };
     
                drS.emplace_back(dr);
            }
            else if (dates_match[dates_date_month_day_month_index].matched)
            {
                assert(drS.size() > 0 && L"Utilisation d'un format mois-jour sans avoir d'année déduite.");
     
                auto month = std::stoi(dates_match[dates_date_month_day_month_index]);
                auto day = std::stoi(dates_match[dates_date_month_day_day_index]);
     
                auto lastDateRecord = drS.back();
                auto last_year = lastDateRecord.date.tm_year + 1900;
     
                assert(checkmonth(month));
                assert(checkday(month, day, last_year));
     
                DateRecord dr{ {0,0,0,day,month - 1,last_year - 1900} };
     
                drS.emplace_back(dr);
            }
            else if (dates_match[dates_date_day_day_index].matched)
            {
                assert(drS.size() > 0 && L"Utilisation d'un format jour sans avoir de mois et d'années déduits.");
     
                auto day = std::stoi(dates_match[dates_date_day_day_index]);
     
                auto lastDateRecord = drS.back();
                auto last_year = lastDateRecord.date.tm_year + 1900;
                auto last_month = lastDateRecord.date.tm_mon + 1;
     
                assert(checkday(last_month, day, last_year));
     
                DateRecord dr{ {0,0,0,day,last_month - 1,last_year - 1900} };
     
                drS.emplace_back(dr);
            }
            else
            {
                assert(true && L"format de date d'épisode inconnu.");
            }
     
            if (dates_match[dates_fucking_someFlag_index].matched)
            {
                drS.back().someFlag = true;
            }
     
            dates_str = dates_match.suffix().str();
        }
     
        if (match[filename_stream_index].matched)
        {
            streaming = match[filename_stream_index];
        }
     
        fucking_e = std::stoi(match[filename_numero_episode_index]);
        //system("PAUSE");
        //episode.push_back(make_tuple(fucking_x, fucking_e, drS, streaming));
        //afficher_Episode_Titre(m_cheminFichier);
        bool found;
        std::vector<std::wstring> t = lire_fichierTxt(m_cheminFichier.wstring(), { L"\n" }, false);
        size_t pos = 0;
        if (t[0] == L"")
        {
            found = false;
            return;
        }
        pos = t[0].find(L". ");
        if (pos == std::wstring::npos || t[0][3] == L'.')
        {
            //saison = 0;
            episode = 0;
        }
        else
        {
            unsigned int x = std::stoi(t[0], &pos);
            t[0] = t[0].substr(pos + 2);
        }
        bool found2 = false;
        pos = t[0].find(L" - ");
        if (pos != std::wstring::npos && !found2)
        {
            titre = t[0].substr(0, pos);
            deux_points = L" : ";
            sous_titre = t[0].substr(pos + 3);
            found2 = true;
        }
        pos = t[0].find(L" : ");
        if (pos != std::wstring::npos && !found2)
        {
            titre = t[0].substr(0, pos);
            deux_points = L" : ";
            sous_titre = t[0].substr(pos + 3);
            found2 = true;
        }
        pos = t[0].find(L": ");
        if (pos != std::wstring::npos && !found2)
        {
            titre = t[0].substr(0, pos);
            deux_points = L": ";
            sous_titre = t[0].substr(pos + 2);
            found2 = true;
        }
        pos = t[0].find(L'/');
        if (pos != std::wstring::npos && !found2)
        {
            titre = t[0].substr(0, pos);
            deux_points = L"/";
            sous_titre = t[0].substr(pos + 1);
            found2 = true;
        }
        if (pos == std::wstring::npos && !found2)
        {
            titre = t[0];
            deux_points = L"";
            sous_titre = L"";
            found2 = true;
        }
        bool temps = afficher_Temps(t[1]);
        pos = 0;
        tm.tm_min = std::stoi(t[1], &pos);
        phrases = L"";
        for (auto j = 2; j < t.size(); j++)
        {
            phrases += t[j];
        }
        found = true;
        //system("PAUSE");
    }
    Moyennement !!!

    Et :
    Nom : Capture.PNG
Affichages : 51
Taille : 76,1 Ko
    https://www.allocine.fr/series/fiche...rie=30107.html

    Et :
    https://www.allocine.fr/series/fiche.../saison-37153/
    Problème aussi !!!

    Merci d'avance
    Images attachées Images attachées  

+ 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