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

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Cinema::afficher_Soundtrack()
    {
    
    	// utiliser les fonctions plus générique ("de plus bas niveau") pour avoir un code simple pour les fonction de plus "haut" niveau
    	// Il y a peut-être un peu de customisation pour gérer les "rôles" mais rien d'insurmontable
    	std::vector<std::pair<std::wstring, std::wstring>> clevaleurs = lire_paireCleValeur_depuisFichierTxt(L"Soundtrack.txt");
    
    	Console::PrintStringW(Console::Ponctuation_Color + L"Soundtrack :" + Console::End_Ln);
    
    	for (const auto& [cle, valeur] : clevaleurs) {
    		Console::affiche_CleValeur(L"\t" + cle, valeur);
    	}
    }
    lire_paireCleValeur_depuisFichierTxt ??? Oublié !
    Console:: PrintStringW(...) ???

    Simple et claire !

    Merci d'avance

  2. #242
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 139
    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 139
    Points : 12 239
    Points
    12 239
    Par défaut
    Voilà : Pièce jointe 632297

    Avec :
    console.h/.cpp
    you.cpp
    Utils.cpp
    Par rapport à ce zip, on n'avait aussi mentionné d'utiliser un gestionnaire de source type Github pour partager les sources, pensez-y pour simplifier nos échanges et sécuriser votre travail dans le Cloud.

    J'avais compris que vous laissiez la classe Console de côté mais on en voit partout dans votre code.

    Vous en voulez ou vous en voulez pas ?
    (Le message du "11/01/2023, 23h03" montre que vous vous en servez toujours mais que vous avez "réglé" votre petit problème que "j'explique" plus avant.)

    Je ne peux toujours pas compiler votre projet car je n'ai pas la chaîne de compilation assez à jour, ce que je vais dire n'est donc pas "totalement" sûr.

    Vous avez ces erreurs d'édition de lien car ligne 34 d'Utils.cpp vous déclarer une variable globale console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern class Console console;
    Le "extern" indique au compilateur qu'il n'a pas à vérifier que cette variable est bien définie dans l'unité de compilation (généralement le .cpp) et que l'éditeur de lien, qui récupère TOUS les .obj généré par la compilation de chaque .cpp, se démerdera pour trouvé une "définition" dans l'un des .obj.
    Vous avez trompé le compilateur mais l'éditeur de lien, lui, il a cherché la définition de la globale console et l'a pas trouvé, donc il gueule.

    Franchement, dégagé au plus vite toutes ces variables globales et encore plus vite ces "extern" qui complexifient le code pour rien.

    Le message du "11/01/2023, 23h03" semble montrer que vous arrivez à lancer le machin, c'est bien.
    Mais j'ai assez peu d'espoir sur la méthode utilisée pour rendre "générable" le code.
    Comment avez-vous contournez l'erreur d'édition de lien, SVP ?

    En supprimant cette variable globale, en modifiant le code qui utilise cette variable pour qu'il utilise les fonctions libres utilitaires (PrintTmp, etc...) dont on a parlé précédemment mais dont je ne vois pas le code dans Utils.h/.cpp est la méthode la plus simple de corriger le problème.

    Pourquoi ces fonctions libres utilitaires ne sont pas encore implémentées ?

    et (exemple)
    Chaˉne d'origine : RTBF
    Solution ?
    C'est parce que votre console n'est pas encore bien configurer pour afficher des accents "français"

    Lynix a fait un billet de blog qui synthétise la problématique des accents.

    https://sirlynixvanfrietjes.be/2020/...e-les-accents/

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

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

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

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

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

    Informations forums :
    Inscription : Avril 2021
    Messages : 512
    Points : 0
    Points
    0
    Par défaut
    Par rapport à ce zip, on n'avait aussi mentionné d'utiliser un gestionnaire de source type Github pour partager les sources, pensez-y pour simplifier nos échanges et sécuriser votre travail dans le Cloud.
    Commant faire ???

    J'avais compris que vous laissiez la classe Console de côté mais on en voit partout dans votre code.

    Vous en voulez ou vous en voulez pas ?
    (Le message du "11/01/2023, 23h03" montre que vous vous en servez toujours mais que vous avez "réglé" votre petit problème que "j'explique" plus avant.)
    d:\work\prg\cpp\you\ : Moi même ! (Console_Lire_txt, ...)
    d:\work\prg\cpp\you \ : Vous et moi ! (PrintStringW et Console_Lire_txt, ...)

    Je ne peux toujours pas compiler votre projet car je n'ai pas la chaîne de compilation assez à jour, ce que je vais dire n'est donc pas "totalement" sûr.
    Ah ! Mince !

    Le "extern" indique au compilateur qu'il n'a pas à vérifier que cette variable est bien définie dans l'unité de compilation (généralement le .cpp) et que l'éditeur de lien, qui récupère TOUS les .obj généré par la compilation de chaque .cpp, se démerdera pour trouvé une "définition" dans l'un des .obj.
    Vous avez trompé le compilateur mais l'éditeur de lien, lui, il a cherché la définition de la globale console et l'a pas trouvé, donc il gueule.

    Franchement, dégagé au plus vite toutes ces variables globales et encore plus vite ces "extern" qui complexifient le code pour rien.
    Décacher ! Ok ! Bon !

    Le message du "11/01/2023, 23h03" semble montrer que vous arrivez à lancer le machin, c'est bien.
    Mais j'ai assez peu d'espoir sur la méthode utilisée pour rendre "générable" le code.
    Comment avez-vous contournez l'erreur d'édition de lien, SVP ?
    Moi ! Seul ! Rrrr : je sais

    En supprimant cette variable globale, en modifiant le code qui utilise cette variable pour qu'il utilise les fonctions libres utilitaires (PrintTmp, etc...) dont on a parlé précédemment mais dont je ne vois pas le code dans Utils.h/.cpp est la méthode la plus simple de corriger le problème.
    Euh ! Commant faire ???
    Exemple :
    Utils.rar

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

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

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

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

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

    Informations forums :
    Inscription : Avril 2021
    Messages : 512
    Points : 0
    Points
    0
    Par défaut
    Pouvez-vous faire des phrases plus courtes

    Merci d'avance

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

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

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

    (You 1)

    J'ai consulté "pair" et Soundtrack et/ou Avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    void Cinema::afficher_Soundtrack()
    {
     
    	// utiliser les fonctions plus générique ("de plus bas niveau") pour avoir un code simple pour les fonction de plus "haut" niveau
    	// Il y a peut-être un peu de customisation pour gérer les "rôles" mais rien d'insurmontable
    	std::vector<std::pair<std::wstring, std::wstring>> clevaleurs = lire_paireCleValeur_depuisFichierTxt(L"Soundtrack.txt", L" : ");
     
    	//Console::PrintStringW(Console::Ponctuation_Color + L"Soundtrack :" +  console.End_Ln + L"\r\n");
    	Console::PrintStringW(L"Soundtrack :" + L"\r\n");
     
    	for (const auto& [cle, valeur] : clevaleurs) {
    		Console::affiche_CleValeur(L"\t" + cle, valeur);
    	}
    }
    et Utils.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)
    {
        std::string contenuFichier{ u8"" };
        std::string ligneCourante{ u8"" };
        std::vector<std::wstring> retVal{};
     
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
     
        while (getline(fichier, ligneCourante, u8'\n'))
        {
            contenuFichier += ligneCourante + u8'\n';
        }
     
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
     
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
     
        std::size_t pos = 0;
     
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
        if (pos == std::wstring::npos)
            return clevaleurs;
     
        std::size_t pos2 = 0;
        do
        {
            pos = converti.find(L"\n");
            if (pos == std::wstring::npos)
            {
                pos2 = converti.find(L"\n");
                if (pos2 == std::wstring::npos)
                    return clevaleurs;
                pos2 = converti.find(L"...");
                if (pos2 == 0 && pos < pos2)
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    std::wcout << L"aaa" << std::endl;
                    return clevaleurs;
                }
                pos2 = converti.find(L"…");
                if (pos2 == 0 && pos < pos2)
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    std::wcout << L"aaa" << std::endl;
                    return clevaleurs;
                }
                pos2 = converti.find(L".");
                if (pos2 == 0 && pos < pos2)
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    std::wcout << L"bbb" << std::endl;
                    return clevaleurs;
                }
     
            }
            pos2 = converti.find(separeteur);
            if (pos2 == std::wstring::npos)
            {
                clevaleurs.push_back(std::make_pair(converti.substr(0, pos - 1), L""));
                std::wcout << L"ccc" << std::endl;
            }
            else if (pos2 == 0)
            {
                clevaleurs.push_back(std::make_pair(L"", converti.substr(3, pos - 1)));
                std::wcout << L"ddd" << std::endl;
            }
            else if (pos2 > 0)
            {
                clevaleurs.push_back(std::make_pair(converti.substr(0, pos2 - 1), converti.substr(pos2 + 2, pos - 1)));
                std::wcout << L"eee" << std::endl;
            }
     
            converti = converti.substr(pos + 1);
        } while (pos == 0);
        return clevaleurs;
    }
    mais... fatigué !!!

    Exemple (cinema.cpp) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void Cinema::afficher_Par(std::wstring& p_filename, std::wstring const& nomFichier) const
    {
    	assert((p_filename == createdBy_filename) && L"Erreur !!! Par... !");
    	par = lire_fichierTxt(nomFichier, { L"\n", L", " });
    	assert((par.size() != 0));
    }
    Ok ! C'est bien !!!

    Alors, std::vector<std::pair<std::wstring, std::wstring>> ???

    Merci beaucoup et d'aider

  8. #248
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 139
    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 139
    Points : 12 239
    Points
    12 239
    Par défaut
    Par rapport à ce zip, on n'avait aussi mentionné d'utiliser un gestionnaire de source type Github pour partager les sources, pensez-y pour simplifier nos échanges et sécuriser votre travail dans le Cloud.
    Commant faire ???
    Commencez par créer un compte sur le site de Web GitHub (www.github.com).

    Et il semble qu'il y ait tout ce qu'il faut pour directement utiliser GitHub depuis Visual Studio :
    https://visualstudio.microsoft.com/fr/vs/github/

    Euh ! Commant faire ???
    Je ne comprends pas, c'est une question ou une "déclaration".

    Vous semblez avoir corrigé l'erreur à l'édition de lien aux vue des copies d'écran.

    Vous ne fournissez que "Utils.cpp", mais il n'y a qu'une déclaration "externe" dans ce fichier de la variable globale "console". Pour que l'édition de lien fonctionne, il faut que cette variable soit DÉFINIE quelque part, et ce n'est pas dans le code que vous nous avez posté.

    Vous avez donc, il me semble, corrigé le problème avec la "mauvaise" méthode. Mais on rectifiera le tir après.

    "Utils.cpp" me semble "complet". On est prêt pour implémenter SIMPLEMENT les prochaines fonctionnalités et corriger/simplifier le code existant.

    Ah, vous n'avez pas implémenté la fonction "lire_paireCleValeur_depuisFichierTxt" et je n'avais pas vu passer votre question sur cette fonction. Si cela compile, c'est que vous ne vous en servez pas encore ou que vous l'avez défini dans un "mauvais" fichier (logiquement, c'est dans "Utils.cpp" qu'elle doit être définie).
    On va peut-être avoir besoin de l'implémenter pour de nouvelles fonctionnalités, mais on le fera quand on en aura besoin.

    C'est un fichier d'un projet GitHub de @Lynix.

    Aucun rapport avec l'article qu'il a écrit.
    Vous avez des difficultés avec son article ?

    EDIT :
    Pouvez-vous faire des phrases plus courtes
    Oui, Désolé, je vais essayer.

    EDIT 2 :

    void Cinema::afficher_Soundtrack()
    Ok pour le code de cette méthode, c'est pas top mais on corrigera le tir après.
    (Cette méthode ne fait pas que "afficher", elle lit le contenu d'un fichier, ça ne devrait pas être dans cette fonction.)

    lire_paireCleValeur_depuisFichierTxt
    Ce code commence bien puis dévie vers une complexité folle !

    Tout est Ok jusqu'à la ligne 25.

    De la ligne 27 à 33, seule la ligne 29 a un sens, le reste ne sert qu'à faire des erreurs. (code sans aucun intérêt sauf retourner un résultat faux)

    Pour les lignes 34 à 84, normalement, vous devriez avoir un code extrêmement proche voir identique à la fin de la fonction "lire_fichierTxt".

    Voici un extrait de "lire_fichierTxt" qui permet de récupérer une liste d'éléments qui étaient séparés par des séparateurs :
    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
        bool found = false;
    
        do
        {
            found = false;
            size_t pos_found = std::string::npos;
            std::wstring sep_found = L"";
    
            for (auto&& sep : separateurs)
            {
                std::size_t pos = converti.find(sep);
                if (pos != std::wstring::npos && (!found || pos_found > pos))
                {
                    pos_found = pos;
                    found = true;
                    sep_found = sep;
                }
            }
    
            if (found)
            {
                retVal.push_back(converti.substr(0, pos_found));
                converti = converti.substr(pos_found + sep_found.length());
            }
        } while (found);
    
        if (converti.length() > 0)
        {
            retVal.push_back(converti);
        }
    Vous voyez ici qu'il n'y a pas besoin de valeurs en dur et autres traces dans la console "std::wout << ..." qui déglingue/pollue notre interface utilisateur.

    En parlant de pollution, c'est quoi cette cochonnerie dans le code de la fonction "lire_fichierTxt" ci-dessous en rouge :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        std::vector<std::wstring>::iterator iter;
        for (iter = retVal.begin(); iter != retVal.end(); iter++)
            std::wcout << L"iter={" << *iter << L'}' << std::endl;
        return retVal;
    On me dégage cette cochonnerie MAINTENANT, TOUT DE SUITE, FISSA !!!

    Utilisez le débogueur, pas de "trace à la con à base de "std::wout << ...", SVP !!!

    Dans l'extrait de "lire_fichierTxt", la variable "retVal", qui est de type "std::vector<std::wstring>" est rempli avec les éléments contenus dans le fichier.
    Dans notre cas, les éléments d'indice 0, 2, 4, etc... contiennent des clés et les éléments d’indice 1, 3, 5 etc... sont les valeurs.

    Donc si on renomme la variable "retVal" dans l'extrait qu'on a récupéré de "lire_fichierTxt" en items ça donne :
    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
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)
    {
        std::string contenuFichier{ u8"" };
        std::string ligneCourante{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs{};
        std::vector<std::wstring> items{};
     
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
     
        while (getline(fichier, ligneCourante, u8'\n'))
        {
            contenuFichier += ligneCourante + u8'\n';
        }
     
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
     
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
    
        bool found = false;
    
        do
        {
            found = false;
            size_t pos_found = std::string::npos;
            std::wstring sep_found = L"";
    
            for (auto&& sep : separeteurs)
            {
                std::size_t pos = converti.find(sep);
                if (pos != std::wstring::npos && (!found || pos_found > pos))
                {
                    pos_found = pos;
                    found = true;
                    sep_found = sep;
                }
            }
    
            if (found)
            {
                items.push_back(converti.substr(0, pos_found));
                converti = converti.substr(pos_found + sep_found.length());
            }
        } while (found);
    
        if (converti.length() > 0)
        {
            items.push_back(converti);
        }
    
        if (items.size() % 2 != 0)
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' contient un nombre impair d'élément.");
        }
    
        for ( int i = 0; i < item.size() ; i +=2 )
        {
            clevaleurs.push_back(std::make_pair(items[i],items[i+1]));
        }
    
        return clevaleurs;
    }
    Mais vous voyez que le code de "lire_paireCleValeur_depuisFichierTxt" et de "lire_fichierTxt" sont très proche et comme "lire_fichierTxt" est générique, on peut s'en servir pour implémenter bien plus simplement "lire_paireCleValeur_depuisFichierTxt" avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)
    {
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs{};
        std::vector<std::wstring> items = lire_fichierTxt(nomFichier,{separeteur});
     
        if (items.size() % 2 != 0)
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' contient un nombre impair d'élément.");
        }
     
        for ( int i = 0; i < item.size() ; i +=2 )
        {
            clevaleurs.push_back(std::make_pair(items[i],items[i+1]));
        }
     
        return clevaleurs;
    Vous voyez ici l'illustration de l'adage "diviser pour mieux régner".
    On découpe chaque tâche, ici "lire_paireCleValeur_depuisFichierTxt" en sous-tâches plus simple, ici "lire_fichierTxt".

    EDIT 3:

    Pour la fonction "Cinema::afficher_Par", c'est bien gentil mais elle ne fait que lire et n'affiche rien.
    C'est un syndrome bien connu de votre code, malheureusement.
    Regardez du coté de la fonction "Cinema::afficher_Soundtrack" pour avoir un exemple de fonction qui affiche des choses.

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

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

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

    Commencez par créer un compte sur le site de Web GitHub (www.github.com).
    https://github.com/ : ok !
    User : laurent.bouleau : ok !
    Mon de passe : ok !
    Privé : ok !
    You-1 : ok !

    Après ???

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

    Avant : Utils.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)
    // separeteur = 3 ! Ok !
    // Mais : stoi ou... ???
    // Que faire ?
    {
        std::string contenuFichier{ u8"" };
        std::string ligneCourante{ u8"" };
        std::vector<std::pair<std::wstring, std::wstring>> clevaleurs;
     
        ifstream fichier{ nomFichier };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
     
        while (getline(fichier, ligneCourante, u8'\n'))
        {
            contenuFichier += ligneCourante + u8'\n';
        }
     
        if (contenuFichier == u8"")
        {
            throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
        }
        //wstring_convert<codecvt_utf8_utf16<wchar_t>, wchar_t> convertiseur;
     
        wstring_convert<codecvt_utf8<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
        converti += L"\n";
     
        std::size_t pos = converti.length();
     
        if (pos == std::wstring::npos)
            return clevaleurs;
     
        std::size_t pos2 = 0;
        while (pos = converti.find(L"\n"))
        {
            if (converti[0] != converti.length())
            {
                pos2 = converti.find(L"...");
                if (pos2 != std::wstring::npos && converti[0] == L'.' && converti[1] == L'.' && converti[2] == L'.')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                pos2 = converti.find(L"…");
                if (pos2 != std::wstring::npos && converti[0] == L'')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
                pos2 = converti.find(L".");
                if (pos2 != std::wstring::npos && converti[0] == L'')
                {
                    clevaleurs.push_back(std::make_pair(L"…", L""));
                    return clevaleurs;
                }
     
                pos2 = converti.find(separeteur);
                if (pos2 == std::wstring::npos && pos != std::wstring::npos)
                {
                    clevaleurs.push_back(std::make_pair(converti.substr(0, pos - 1), L""));
                }
                else if (pos2 == 0)
                {
                    clevaleurs.push_back(std::make_pair(L"", converti.substr(3, (pos - 1) - 2)));
                }
                else if (pos > pos2)
                {
                    clevaleurs.push_back(std::make_pair(converti.substr(0, pos2), converti.substr(pos2 + 3, pos - (pos2 + 3))));
                }
                else
                {
                    // ???
                    break;
                }
                converti = converti.substr(pos + 1);
     
            }
            else
                break;
     
        }
        return clevaleurs;
    }
    Merci d'avance

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

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

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

    Comment faire : std::wcout << (xxx) * L' ';
    Et pas \t !

    Exemple (Blade Runner 2049) :
    Compositeur : Hans Zimmer
    Superviseur musical : Deva Anderson
    Compositeur : Benjamin Wallfisch
    et :
    Compositeur _____ : Hans Zimmer
    Superviseur musical : Deva Anderson
    Compositeur_____ : Benjamin Wallfisch
    Merci beaucoup

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

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

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

    https://github.com/ : ok !
    User : laurent.bouleau : ok !
    Mon de passe : ok !
    Privé : ok !
    You-1 : ok !
    laurentbouleau/You :
    Utils.h
    Utils.cpp
    consoles.h
    etc...
    ok !
    README.md ---> You ---> Ok ou pas ???

    Commant faire ???

    Merci d'avance

  12. #252
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 139
    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 139
    Points : 12 239
    Points
    12 239
    Par défaut
    https://github.com/ : ok !
    User : laurent.bouleau : ok !
    Mon de passe : ok !
    Privé : ok !
    You-1 : ok !
    C'est peut-être un peu trop 'Privé".
    J'arrive pas à voir vos dépôts.
    S'ils ne sont pas publics, il faudrait m’autoriser les accès.
    Le plus simple c'est de faire de votre dépôt, un dépôt public.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const std::vector<std::pair<std::wstring, std::wstring>>lire_paireCleValeur_depuisFichierTxt(std::wstring const& nomFichier, std::wstring separeteur)...
    Vous utilisez beaucoup de constante en dur.
    Utilisez les paramètres pour passer ces valeurs pour que la fonction s'adapte facilement.
    Les "..." et "_" semble avoir un comportement très spécial, c'est juste pour des tests ou c'est vraiment un truc "spécial".
    Si c'est un truc "spécial", je pense qu'il faut ajouter un paramètre avec l'ensemble des ces valeurs spéciales ET LUI DONNER UN NOM QUI CORRESPOND A LA SIGNIFICATION DE CE TRUC SPECIAL.

    Pourquoi ne pas profiter de la fonction "lire_fichierTxt", comme je l'ai fait dans le dernier code de mon message du "20/01/2023, 16h42" pour radicalement simplifier la fonction ?
    Même avec les "valeurs spéciales", le code de la fonction "lire_paireCleValeur_depuisFichierTxt" serait bien plus simple en utilisant la fonction "lire_fichierTxt".

    Comment faire : std::wcout << (xxx) * L' ';
    Et pas \t !

    Exemple (Blade Runner 2049) :
    C'est là où le fait de bien dissocier la récupération des données et l'affichage des données montre tout son intérêt.

    Si cette mise en forme ne s'applique qu'aux valeurs d'un fichier seul comme "Soundtrack.txt".
    La fonction "lire_paireCleValeur_depuisFichierTxt" renvoie un ensemble de paires "clé/valeur".
    Il est très simple de scanner le std::vector de paires retourné par "lire_paireCleValeur_depuisFichierTxt" pour déterminer quelle est la clé la plus longue.
    Une fois cette longueur déterminé, il y bien des façons de faire.
    Par exemple, la manière la plus simple, vraisemblablement, pour vous (mais pas forcément la plus pérenne), c'est de modifier le contenu du std::vector retourné par "lire_paireCleValeur_depuisFichierTxt" pour ajouter des espaces aux différentes clés des paires pour qu'elles aient toutes la même longueur que la clé la plus longue.
    Une fois cette "correction" faite, vous pouvez passer ce std::vector "corrigé" à votre fonction d'affichage "générique" et elle affichera simplement les paires clé/valeur alignées impeccablement sans rien changer à cette fonction d'affichage.

    Si l'alignement doit se faire sur plus de paires que celles contenus dans un seul fichier, c'est là que l'utilisation d'une instance d'objet prend son sens avec ses champs.

    README.md ---> You ---> Ok ou pas ???

    Commant faire ???
    Je ne suis pas sûr de comprendre la question.
    Mais pour l'instant, laissez tomber "README.md".
    C'est juste pour présenter le projet.
    Ça n'a aucun impact sur la compilation du projet.

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

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

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

    https://github.com/ : ok !
    User : laurent.bouleau : ok !
    Mon de passe : ok !
    Privé : ok !
    You : ok !
    laurentbou.../You : Public : ok !

    Merci d'avance

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

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

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

    Pas-à-pas !!!

    Ok !
    Si on passe par un champ "m_note_str" dans la classe Serie ou Cinema, le code dans le constructeur sera aussi simple que :
    et :
    Déjà indiqué que les cast, ça sert pas à cela.
    Vous avez trouvé tout seul une bien meilleure méthode.

    "D_I" comme nom de variable (globale ou de champ) ???
    Non mais, vous déconnez !!! Donnez des noms correctes à vos variables !!!
    Par exemple, vous avez un champ "m_episode" de type std::vector<Episode> qui contiendra les informations pour chaque épisode (Episode est une classe).

    Pour faire la moyenne, le STL donne un ensemble d'algorithmes qui permet de faire ce calcul en une ligne à partir d'un std::vector.
    Donc, en code, si un episode converti en float/double donne sa note :
    Et :
    Toujours les mêmes problèmes de code trop compliqué.
    [...]
    Ok :
    note = static_cast<int>(f * 20.0f);
    Non, un cast, c'est pas une conversion.
    Utilisez "std::stoi(...)" pour faire les conversions.
    Ok !
    Mais :
    cd /work/prg/cpp/you/x64/Release
    (Avant (Console_Lire_txt))
    et
    cd /work/prg/cpp/you 1/x64/Release
    (Après (PrintStringW))

    Par exemple, vous avez un champ "m_episode" de type std::vector<Episode> qui contiendra les informations pour chaque épisode (Episode est une classe).
    ??? Plus simple ! Solution ? champ "m_episode" de type std::vector<Episode> ?

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

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrintStringW(hOut, str, 4)
    Que faire ?

    Merci d'avance ;-)

  15. #255
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 139
    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 139
    Points : 12 239
    Points
    12 239
    Par défaut
    laurentbou.../You : Public : ok !
    Pouvez-vous fournir l'URL de votre dépôt GitHub, svp ?
    Les outils de recherche sur le site ne donnent rien de probant avec "laurent bouleau".

    Si on passe par un champ "m_note_str" dans la classe Serie ou Cinema, le code dans le constructeur sera aussi simple que :
    et :
    Déjà indiqué que les cast, ça sert pas à cela.
    Vous avez trouvé tout seul une bien meilleure méthode.

    "D_I" comme nom de variable (globale ou de champ) ???
    Non mais, vous déconnez !!! Donnez des noms correctes à vos variables !!!
    Par exemple, vous avez un champ "m_episode" de type std::vector<Episode> qui contiendra les informations pour chaque épisode (Episode est une classe).

    Pour faire la moyenne, le STL donne un ensemble d'algorithmes qui permet de faire ce calcul en une ligne à partir d'un std::vector.
    Donc, en code, si un episode converti en float/double donne sa note :
    Et :
    Toujours les mêmes problèmes de code trop compliqué.
    [...]
    Ok :
    note = static_cast<int>(f * 20.0f);
    Non, un cast, c'est pas une conversion.
    Utilisez "std::stoi(...)" pour faire les conversions.
    Ok !
    Le "Ok !", c'est que ce qui est évoqué dans ces phrases, c'est assimilé, ou qu'il faut plus d'explications ?

    Mais :
    cd /work/prg/cpp/you/x64/Release
    (Avant (Console_Lire_txt))
    et
    cd /work/prg/cpp/you 1/x64/Release
    (Après (PrintStringW))
    Je ne comprends pas la question ?
    Vous donnez 2 chemins vers les répertoires qui contiennent/contiendront le résultat de la compilation/génération.
    L'un utilisant "you", mentionnant cette horreur de "Console_Lire_txt".
    L'autre utilisant "you 1" mentionnant "PrintStringW".
    Vous avez changé le nom du projet/exécutable de "you" à "you 1" en supprimant l'utilisation de "Console_Lire_txt" et en utilisant maintenant "PrintStringW" ?

    ??? Plus simple ! Solution ? champ "m_episode" de type std::vector<Episode> ?
    Si c'est compliqué pour vous. On regardera cela un peu plus tard.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PrintStringW(hOut, str, 4)
    Que faire ?
    Quelle est la question ?

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

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

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

  17. #257
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 139
    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 139
    Points : 12 239
    Points
    12 239
    Par défaut
    Ok !

    "Utils.rar" a enlever, je pense.

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

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

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

    "Utils.rar" a enlever, je pense.
    Avant : une semaine ou deux semaines !

    --------------------------------
    Serie (plus tard...) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    const void Serie::PrintNote(int I, int x)
    {
        if (affichage_note_actif)
        {
            std::wstring m_note_str;
            bool found = false;
            for (const auto& [cle, valeur] : m_note)
            {
                if (I == cle)
                {
                    found = true;
                    m_note_str = keyColor2 + L"Note : " + valueColor2;
                    if (valeur == -1.0)
                    {
                        found = false;
                        break;
                    }
                    else if (valeur == 0 || valeur == 1 || valeur == 2 || valeur == 3 || valeur == 4 || valeur == 5)
                    {
                        m_note_str += std::to_wstring(valeur); // Exemple : Note : 3,000000/5 ???
                    }
                    else
                    {
                        std::wstring wstr = std::to_wstring(valeur);
                        wstr = wstr[0] + keyColor2 + wstr[1] + valueColor2 + wstr[2];
                        m_note_str += wstr + L'x';
                    }
                    m_note_str += keyColor2 + L"/5" + valueColor2;
                    int i = Console_Lire_txt(m_note_str, x, x);
                    break;
                }
            }
            if (!found)
                int i = Console_Lire_txt(keyColor2 + L'(' + valueColor2 + L"Pas de note !" + keyColor2 + L')' + valueColor2, x, x);
        }
    }
    ---> // Exemple : Note : 3,000000/5 ???
    ???

    Merci d'avance

  19. #259
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 139
    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 139
    Points : 12 239
    Points
    12 239
    Par défaut
    C'est lié à votre ligne 24 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wstring wstr = std::to_wstring(valeur);
    C'est le format d'affichage par défaut d'un nombre à virgule flottante (double).

    Avec le code suivant, vous devriez avoir "3" à la pace de "3,000000" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wstring wstr = std::to_wstring(static_cast<int>(std::floor(valeur)));

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

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

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

    C'est lié à votre ligne 24 :

    C'est le format d'affichage par défaut d'un nombre à virgule flottante (double).

    Avec le code suivant, vous devriez avoir "3" à la pace de "3,000000" :
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::wstring wstr = std::to_wstring(static_cast<int>(std::floor(valeur)));
    Noté

    Merci beaucoup

+ 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