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. #161
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Bonjour (deux),

    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
    const int Serie::afficher_Creee_par(std::wstring& c, std::wstring const& _T)
    {
        if (c == L"Créée par.txt")
        {
            try
            {
                //c = afficher_fichier_lire(_T);
                creee_par = afficher_fichier_lire(_T, L", ", false);
            }
            catch (runtime_error const& exception)
            {
                std::wcout << L"Erreur : " << exception.what() << std::endl;
            }
        }
        else
        {
            E.afficher_X(-1, _T, L"Erreur !!! Créée par... !");
            return EXIT_FAILURE;
        }
     #if Serie_afficher_Creee_par_ == 1
        std::wstring wstr = L"creee_par={";
        for (const wstring& cc : creee_par)
        {
            wstr += cc;
            if (creee_par.back() != cc)
                wstr += L", ";
        }
        B.Ok_W(wstr + L'}');
    #endif
        if (creee_par.size() == 0)
        {
            creee_par_ = false;
    #if Serie_afficher_Creee_par_ == 1
            B.Ok_T(L"const int Serie::afficher_Creee_par() : Attention : Creee_par={} !");
    #endif
            E.afficher_X(-1, _T, L"Attention : Creee_par={}");
            return EXIT_FAILURE;
        }
        creee_par_ = true;
        return EXIT_SUCCESS;
    }
    creee_par (serie), de (film), par (film)... : afficher_ Verbe et/ou Nom ?

    genre, c_nationalite et s_nationalite :
    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::wstring>Genre
    {
        L"Action",
        L"Arts Martiaux",
    ...
    };
     
    const std::vector<std::wstring> C_Nationalite
    { // Nationalité
        L"Allemand",
    ...};
     
    const std::vector<std::wstring> S_Nationalite
    {
        L"Allemagne",
    ...
    };
    const int afficher_Genre(std::wstring& g, std::wstring const& _T, std::vector<std::wstring>& G, const std::vector<std::wstring>& GG) : afficher_ Verbe et/ou Nom

    Titre original, Chaîne d'origine, etc : std::wstring ===> std::vector<std::wstring> ???

    Merci d'avance

  2. #162
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    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 071
    Points : 12 116
    Points
    12 116
    Par défaut
    (connaissance du C++)
    Ben oui !
    Cool

    const class Titre (La sœur !!! (c'est tout !))
    La sœur de quoi ???
    Si c'est pour un titre, appelez la classe "Titre", comme vous semblez l'avoir fait, mais aussi renommez les fichiers pour que leur nom corresponde au nom de la classe.
    Mais à la tête des fonctions de la classe, je ne trouve pas que cela ressemble à des fonctions d'un "Titre".

    const class Titre; (c_s.h et c_s.cpp) : ok !
    Renommez les fichiers, SVP.

    Pour la déclaration "friend", on les déclare dans la classe qui "ouvre" ses membres à son ami :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    const class Titre;
    const class Cinema
    {
    	friend class Titre;
    ...
    };
     
    const class Titre;
    const class Serie
    {
    	friend class Titre;
    ...
    };
    Ok ! Par contre : Console:: ! Comment faire ???
    Bin, Console, ça peut être une classe exactement comme "Titre", "Cinema" ou encore "Serie".
    (On pourrait en faire un espace de nom (namespace pour les intimes) mais je pense que des évolutions futures sur la console mériteraient la création d'au moins une classe)

    Ok ! Mince !
    Mince pourquoi ?

    Mais on peut "travailler" sur vos implémentations "const int afficher_Genre(...)"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int afficher_Genre(std::wstring& g, std::wstring const& _T, std::vector<std::wstring>& G, const std::vector<std::wstring>& GG)
    Il faut absolument correctement nommer les fonctions ET les paramètres !!!
    Sans ça, c'est compliqué de savoir à quoi ça sert. (ici, c'est surtout le nom des paramètres qui sont cryptiques)

    Retourner un int pour ce type de fonction, c'est plus du C que du C++.

    En C++, on passe par des exceptions pour des cas exceptionnels et par std::assert pour les erreurs de programmation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    void afficher_Genre(std::wstring& genre_filename, std::wstring const& _T, std::vector<std::wstring>& genres_renvoyes, const std::vector<std::wstring>& genres_valides)
    { // Genre
        std::size_t pos_txt= genre_filename.find(L".txt");
     
        assert((pos_txt != std::string::npos) && L"Erreur !!!");
     
        std::wstring radical = genre_filename.substr(0, pos_txt);
     
        std::vector<std::wstring>gg;   // C'est quoi ce putain de nom de variable !!!!
        // et on dégage le try/catch, la gestion des erreurs, c'est pas là.
        // Putain, "_T" mon c.. de nom de paramètre à la con !!!
        gg = afficher_fichier_lire(_T, L", ", false);
     
        for (auto&& genre : gg)
        {
            if (std::find(genres_valides.begin(), genres_valides.end(), genre) != genres_valides.end())
                genres_renvoyes.push_back(genre);
            else
            {
                assert((false) && "Attention genre non valide !!!");
            }
        }
    }
    Les traces, c'est pas les mettre au début, le débogueur et les assert font le taf. (Des MACRO utilisant le RAII feront bien mieux, après)

    et "const int afficher_Soundtrack(...)".
    Oui : exemple ?
    Vous n'avez, il me semble, jamais donné le code "complet" de cette fonction.

    u8"…" ===> L"." ou L"..." : Problème ???
    Je suis pas sûr de comprendre la question.
    Pour le code UNICODE des points de suspension :
    https://www.compart.com/fr/unicode/U+2026

    Pour "const int Serie::afficher_Creee_par(std::wstring& c, std::wstring const& _T)", idem que "afficher_Genre":
    Changer la signature pour avoir un void en type de retour, utilisez des exceptions et assert et ne "gérez" pas les erreurs n'importe où, SVP.
    Utilisez des noms corrects pour vos paramètres, bordel.
    N'utilisez pas de valeurs en dur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void Serie::afficher_Creee_par(std::wstring& c, std::wstring const& _T)
    {
        assert((c == createdBy_filename) &&  L"Erreur !!! Créée par... !");
     
        std::vector<std::wstring> creee_par = afficher_fichier_lire(_T, L", ", false); //  afficher_fichier_lire n'a pas à renvoyer de la merde, juste lancer des exceptions
     
        assert((creee_par.size() != 0))
    }
    genre, c_nationalite et s_nationalite :
    Pourquoi ces préfixes "C_" et "S" ????

    afficher_ Verbe
    Afficher est bien un verbe, mais vos fonctions qui commencent par "afficher" ne font pas qu'afficher => SRP (une fonction ne fait qu'une chose)
    Donc pas de décodage ou de gestion des fichiers dans ce type de fonction. => Il y a des chances que tout ce qui n'est pas de l'affichage atterrisse dans quelques fonctions bien plus génériques que ces usines à gaz (que j'arrive à écrire en 3 à 20 lignes (pleines de lignes blanches en plus) quand on arrête d'y mettre tout et n'importe quoi).

    Titre original, Chaîne d'origine, etc : std::wstring ===> std::vector<std::wstring> ???
    Pourquoi mettre "Titre original" ou "Chaîne d'origine" dans un vector ??? Normalement, il n'y a qu'UN titre original et UNE chaîne d'origine.

  3. #163
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Toi : grrrr ! par choix !!!

  4. #164
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    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 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Heu, quel choix ?

  5. #165
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Aphasie : Trouble du langage lié à une lésion du cerveau. Dans mon cas, le langage oral et le langage écrit sont touchés. Je comprends mais je m’exprime par mots isolés.
    Ici : https://www.b-lolo.fr/avc/

    La sœur de quoi ???
    Merci d'avance ! Marie-France (grande-sœur) !

    Bin, Console, ça peut être une classe exactement comme "Titre", "Cinema" ou encore "Serie".
    (On pourrait en faire un espace de nom (namespace pour les intimes) mais je pense que des évolutions futures sur la console mériteraient la création d'au moins une classe)
    ??? pourquoi ?

    Il faut absolument correctement nommer les fonctions ET les paramètres !!!
    Sans ça, c'est compliqué de savoir à quoi ça sert. (ici, c'est surtout le nom des paramètres qui sont cryptiques)
    Verbe et nom... Ben quoi !

    Retourner un int pour ce type de fonction, c'est plus du C que du C++.
    Noté !

    Les traces, c'est pas les mettre au début, le débogueur et les assert font le taf. (Des MACRO utilisant le RAII feront bien mieux, après)

    et "const int afficher_Soundtrack(...)".
    Oui : exemple ?
    Vous n'avez, il me semble, jamais donné le code "complet" de cette fonction.

    u8"…" ===> L"." ou L"..." : Problème ???
    Je suis pas sûr de comprendre la question.
    Pour le code UNICODE des points de suspension :
    https://www.compart.com/fr/unicode/U+2026
    ???


    Pour "const int Serie::afficher_Creee_par(std::wstring& c, std::wstring const& _T)", idem que "afficher_Genre":
    Changer la signature pour avoir un void en type de retour, utilisez des exceptions et assert et ne "gérez" pas les erreurs n'importe où, SVP.
    Utilisez des noms corrects pour vos paramètres, bordel.
    N'utilisez pas de valeurs en dur.
    Comment faire : L'AVC !!! Oui, j'ai oublié, encore !!!

    const class Titre;
    const class Titre ===> const int Titre::afficher_AD(std::wstring& a, std::wstring& ad, const std::wstring& _T)
    public, protected et private ?
    wstring ad et bool ad_ ?

    Etc...

  6. #166
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    _T est un très mauvais nom de variable: Les noms commençant par des underscores sont réservés (et Visual Studio en particulier utilise _T pour une macro).
    De plus, ça veut dire quoi a? Ça veut dire quoi ad? Ça veut dire quoi _T ?
    Avec des noms de paramètres on ne sait pas de quoi ça parle.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #167
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Aphasie ! afficher_*() : verbe et/ou nom... ?

    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
    const wstring afficher_fichier_lire(std::wstring t, std::wstring _T)
    {
        wchar_t const* t_ = _T.c_str();
        FILE* fichier = NULL;
        if ((fichier = _wfopen(t_, L"r")) == NULL) // C4996
        { // Note: fopen is deprecated; consider using fopen_s instead
    #if afficher_fichier_lire_ == 1
            wcerr << L"Le fichier '" << t_ << L"' n'a pas été ouvert !\n" << endl;
    #endif
            //afficher_X(0, _T, L"Le fichier n'a pas été ouvert !");
            return L"";
        }
        string p = u8"";
        char phrase[254] = { u8"" };
        while (!feof(fichier))
        {
            if (fgets(phrase, 254, fichier) == NULL)
                break;
            else
                p += phrase;
        }
        fclose(fichier);
        //assert(p == u8"");
        if (p == u8"")
            return L"";
        assert(p != u8"");
        wstring_convert<codecvt_utf8_utf16<wchar_t>, wchar_t> convert;
        std::wstring P = convert.from_bytes(p);
         rtrim(P);
        return P;
    }
    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
    const std::vector<std::wstring> afficher_fichier_lire(std::wstring const& t, std::wstring m, bool m_ = false) // m_ ???
    {
        std::string lignes{ u8"" };
        std::string ligne{ u8"" };
        ifstream fichier{ t };
        if (!fichier)
        {
            throw std::runtime_error("Fichier impossible à ouvrir.");
        }
        while (getline(fichier, ligne, u8'\n'))
        {
            lignes += ligne + u8'\n';
        }
        if (lignes == u8"")
            return { L"" };
        assert(lignes != u8"");
        wstring_convert<codecvt_utf8_utf16<wchar_t>, wchar_t> convert;
        std::wstring P = convert.from_bytes(lignes);
        rtrim(P);
        if(m != L"")
            P = replace_all(P, m, L"\n");
        std::vector<std::wstring> pp;
        while (std::size_t pos = P.find(L'\n'))
        {
            pp.push_back(P.substr(0, pos));
            P = P.substr(pos + 1);
            if (pos == std::wstring::npos)
                break;
        }
        return pp;
    }
    ???

    Merci d'avance

  8. #168
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    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 071
    Points : 12 116
    Points
    12 116
    Par défaut
    La sœur de quoi ???
    Merci d'avance ! Marie-France (grande-sœur) !
    N'appelez donc pas une classe "C_S" juste parce que c'est la "grande-sœur" de qui que ce soit, SVP.

    Bin, Console, ça peut être une classe exactement comme "Titre", "Cinema" ou encore "Serie".
    (On pourrait en faire un espace de nom (namespace pour les intimes) mais je pense que des évolutions futures sur la console mériteraient la création d'au moins une classe)
    ??? pourquoi ?
    Pourquoi quoi ?
    Je répondais à :
    Ok ! Par contre : Console:: ! Comment faire ???
    Pour avoir les fonctions "PrintStringW" isolées dans un "groupe" de nom "Console", j'ai défini les fonctions sous la forme "Console:: PrintStringW", car je pense qu'elles devraient être des fonctions d'une classe "Console" qui regrouperai tous les services liées aux consoles.
    Donc faut juste déclarer une classe Console avec les fonctions membre "PrintStringW' correspondant aux implémentations que j'ai posté.


    Il faut absolument correctement nommer les fonctions ET les paramètres !!!
    Sans ça, c'est compliqué de savoir à quoi ça sert. (ici, c'est surtout le nom des paramètres qui sont cryptiques)
    Verbe et nom... Ben quoi !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const int afficher_Genre(std::wstring& g, std::wstring const& _T, std::vector<std::wstring>& G, const std::vector<std::wstring>& GG)
    Ca veut dire quoi g ? (genre ?, je suppose, mais dans le corps de la fonction, c'est plutôt le nom d'un fichier.)
    Ca veut dire quoi _T ?
    Ca veut dire quoi G ?
    Ca veut dire quoi GG ?
    etc...

    Les traces, c'est pas les mettre au début, le débogueur et les assert font le taf. (Des MACRO utilisant le RAII feront bien mieux, après) (1)

    et "const int afficher_Soundtrack(...)".
    Oui : exemple ?
    Vous n'avez, il me semble, jamais donné le code "complet" de cette fonction.(2)

    u8"…" ===> L"." ou L"..." : Problème ???
    Je suis pas sûr de comprendre la question.(3)
    Pour le code UNICODE des points de suspension :
    https://www.compart.com/fr/unicode/U+2026
    ???
    Les "???" correspondent à quoi ???

    (1)Dégagez tout le code des traces, il est inutilement invasifs et rend la gestion des erreurs compliquée. Cf. mon code qui n'a pas de code de trace mais qui fait aussi bien, voire beaucoup mieux, avec un débogueur.

    (2)Vous semblez demander un exemple pour "afficher_Soundtrack(...)", mais vous nous avez jamais donné le code actuel de "afficher_Soundtrack(...)".

    (3) J'essaie de comprendre votre "question" :
    u8"…" ===> L"." ou L"..." : Problème ???
    Pour "const int Serie::afficher_Creee_par(std::wstring& c, std::wstring const& _T)", idem que "afficher_Genre":
    Changer la signature pour avoir un void en type de retour, utilisez des exceptions et assert et ne "gérez" pas les erreurs n'importe où, SVP.
    Utilisez des noms corrects pour vos paramètres, bordel.
    N'utilisez pas de valeurs en dur.
    Comment faire : L'AVC !!! Oui, j'ai oublié, encore !!!
    Comment faire quoi ?

    - Changer la signature ...
    Bin, faire comme pour "afficher_Genre"
    "const int Serie::afficher_Creee_par(std::wstring& c, std::wstring const& _T)" devient "void Serie::afficher_Creee_par(std::wstring& unNomDeVariableQuiVeutDireQuelquechose, std::wstring const& unAutreNomDeVariableQuiVeutDireAutreQuelquechose)"

    - Utilisez des noms corrects ...
    "c" et "_T", ça veut rien dire, décortiquez le code de la fonction pour savoir à quoi correspond ces paramètres (à quoi ils servent) et changez leur nom pour qu'ils (leur nom) exprime leur fonction/utilité.

    - N'utilisez pas de valeurs en dur.
    Cf. mon message sur les fichiers de localisation.
    Mais vous pouvez déjà commencer par déclarer ces valeurs sous forme de constante au début du fichier, ou dans un fichier dédié à ces constantes, et utiliser ces constantes plutôt que les valeurs en dur dans le code des fonctions.


    const class Titre;
    const class Titre ===> const int Titre::afficher_AD(std::wstring& a, std::wstring& ad, const std::wstring& _T)
    public, protected et private ?
    wstring ad et bool ad_ ?
    Moi, j'avais juste fait remarquer :
    const class Titre; (c_s.h et c_s.cpp) : ok !
    Renommez les fichiers, SVP.
    c_s.h et c_s.cpp, ça n'a aucun sens, s'ils contiennent la déclaration de la définition de la classe "Titre", ces fichiers doivent se nommer "Titre.h" et "Titre.cpp".

    MSVC est gentil avec vous, le "const" devant la "class", il l'oublie pour être sympa.
    Supprimez ce "const" qui n'a aucun sens. C'est un objet ou une référence sur un objet qui peut être "const", une classe n'est jamais "const" (ça n'a pas de sens).
    const class Titre

    Pour la "pertinence" de la déclaration de la classe "Titre", il faudrait comprend à quoi elle sert, et avec des noms de fonction comme "afficher_AD", c'est quoi AD ?
    Soyez EXPLICITE dans les noms de fonction, SVP
    idem pour les champs "ad" et "ad_", c'est totalement cryptique.
    Idem Soyez EXPLICITE dans les noms de champs, SVP

    const int Titre::afficher_AD(std::wstring& a, std::wstring& ad, const std::wstring& _T)
    Encore et toujours des noms de paramètre totalement abscons, donnez des noms explicites à vos paramètres.

    Aphasie ! afficher_*() : verbe et/ou nom... ?
    Ok, un nom de fonction devrait commencer par un verbe.
    "afficher" est un verbe, cool.
    Après, on devrait indiquer sur quoi s'applique l'action, par exemple.
    Donc "afficher_titre(...)" est un bon nom de fonction si la fonction affiche le titre de la série ou du film.

    Mais les fonctions "afficher_fichier_lire" que vous avez posté n'affiche rien mais lit le contenu d'un fichier.

    Donc, elles devraient se nommer "... lire_fichier(...)".

    La première fonction "afficher_fichier_lire" est bien plus archaïque/boggué que la seconde.

    const wstring afficher_fichier_lire(std::wstring t, std::wstring _T):
    le paramètre "t" ne semble jamais utilisé, le paramètre "_T" semble être le nom du fichier à lire.
    Utilisation de fonction C, comme "_wfopen"
    Utilisation de tableau C : "char phrase[254] "
    "Gestion" d'erreur foireuse (trace au mauvais endroit, etc...)
    etc...

    La première fonction "afficher_fichier_lire" est un brouillon.

    La seconde fonction "afficher_fichier_lire" est bien plus claire et maintenable.

    On commence par correctement la nommer (et on renomme l'un des paramètres avec sa "vraie" utilité):
    const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::wstring m, bool m_ = false) // m_ ???

    Je pense qu'il y a plus direct comme implémentation d'une lecture de fichier ASCII, mais c'est un bon début.

    Ligne 5 devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ifstream fichier{ nomFichier };
    Ligne 8 : utilisation des exceptions pour la gestion d'un cas exceptionnel, OK.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        std::string lignes{ u8"" };
        std::string ligne{ u8"" };
    Avoir 2 variables avec des noms si proches, en plus de même type, c'est très casse-gueule.
    Utilisez des noms de variables plus explicites.
    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        std::string contenuFichier{ u8"" };
        std::string ligneCourante{ u8"" };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        if (lignes == u8"")
            return { L"" };
        assert(lignes != u8"");
    C'est pas cohérent, soit avoir un fichier vide est un cas "normal" et on retourne un std::vector "vide", soit ce n'est pas un cas normal et on lance une exception "std::runtime_error" (par exemple).
    On utilise "assert" pour détecter les erreurs de programmation. Un fichier vide n'est pas une erreur de programmation.

    Donc si un fichier vide est "légal" :
    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
    const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::wstring m, bool m_ = false) // m_ ???
    {
        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"")
        {
            ....
        }
     
        return retVal;
    }
    Si un fichier vide n'est pas "légal" :
    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
    const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::wstring m, bool m_ = false) // m_ ???
    {
        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("Fichier " + nomFichier + " est vide.");
        }
     
        ....
     
        return retVal;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        wstring_convert<codecvt_utf8_utf16<wchar_t>, wchar_t> convert;
        std::wstring P = convert.from_bytes(lignes);
        rtrim(P);
    "P" ??? Un effort sur le nom des variables, SVP.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        wstring_convert<codecvt_utf8_utf16<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        if(m != L"")
            P = replace_all(P, m, L"\n");
    Ici, on remplace les séquences de caractère correspondant au paramètre "m" par un "line feed" (retour à la ligne à la Unix)
    Le "replace_all" correspond probablement à la fonction décrite dans le lien ci-après :
    https://cppsecrets.com/users/1435115...replaceall.php

    On peut donc renommer le paramètre "m" par un truc plus explicite, comme "marqueurFinDeLigne":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::wstring marqueurFinDeLigne, bool m_ = false) // m_ ???
    {
    ...
    }
    Comme le paramètre "m_" n'est jamais utilisé dans le corps de la fonction, on peut le dégager.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::wstring marqueurFinDeLigne)
    {
    ...
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    std::vector<std::wstring> pp;
        while (std::size_t pos = P.find(L'\n'))
        {
            pp.push_back(P.substr(0, pos));
            P = P.substr(pos + 1);
            if (pos == std::wstring::npos)
                break;
        }
        return pp;
    Mais c'est quoi ce nom de variable "pp" à la con ? ! ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
        while (std::size_t pos = converti.find(L'\n'))
        {
            retVal.push_back(converti.substr(0, pos));
            converti = converti.substr(pos + 1);
            if (pos == std::wstring::npos)
                break;
        }
        return retVal;
    Je suis à peu près sur que la fonction "split" fait mieux le travail que cette boucle while un peu foireuse.
    Un coup de Google : https://www.techiedelight.com/fr/spl...ing-delimiter/
    A l'arrache :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
        std::wstringstream converti_stream(converti);
        std::wstring ligne;
        while (std::wgetline(converti_stream, ligne, L'\n')) {
            retVal.push_back(ligne);
        }
        return retVal;

  9. #169
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Merci beaucoup

  10. #170
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    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
    const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::wstring marqueurFinDeLigne)
    {
        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("Fichier " + nomFichier + " est vide."); // Marche par !!!
            throw std::runtime_error("Fichier est vide.");
        }
        wstring_convert<codecvt_utf8_utf16<wchar_t>, wchar_t> convertiseur;
        std::wstring converti = convertiseur.from_bytes(contenuFichier);
        rtrim(converti);
        while (std::size_t pos = converti.find(L'\n'))
        {
            retVal.push_back(converti.substr(0, pos));
            converti = converti.substr(pos + 1);
            if (pos == std::wstring::npos)
                break;
        }
        return retVal;
    }
    et :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    const void Serie::afficher_Creee_par(std::wstring& c, std::wstring const& nomFichier)
    {
        assert((c == createdBy_filename) && L"Erreur !!! Créée par... !");
        std::vector<std::wstring> creee_par = lire_fichierTxt(nomFichier, L", ");// , false); //  afficher_fichier_lire n'a pas à renvoyer de la merde, juste lancer des exceptions
        assert((creee_par.size() != 0));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(creee_par.size() == 0)
    std::wcout << L"aaaa zzzzz" << std::endl;
    ???

  11. #171
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    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 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    //throw std::runtime_error("Fichier " + nomFichier + " est vide."); // Marche par !!!
    Ouais, c'est fait un peu à l'arrache.
    Avec le message d'erreur, ça serait plus simple.
    Je pense que c'est le mélange ASCII UNICODE que le compilateur n'aime pas.

    Si avoir le nom du fichier est important dans le message de l'exception essayez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw std::runtime_error(L"Fichier " + nomFichier + L" est vide.");
    Vous avez donc pris le parti qu'un fichier vide est un cas exceptionnel erroné, OK.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const void Serie::afficher_Creee_par(std::wstring& c, std::wstring const& nomFichier)
    On recommence :
    Ce "const" au début, il sert à quoi ???
    Donnez un nom qui représente ce que doit faire la fonction, ici, elle ne fait que lire les informations "Créee_par".
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<std::wstring> Serie::lire_Creee_par(std::wstring& c, std::wstring const& nomFichier)
    Quel est le role du premier paramètre : c?
    Il doit être systématiquement égal au contenu de la variable "createdBy_filename".
    Au nom de la variable, le paramètre est un nom de fichier mais le second a ce rôle.
    Si un paramètre n'a aucune utilité, on le supprime.
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::vector<std::wstring> Serie::lire_Creee_par()
    {
        std::vector<std::wstring> creee_par = lire_fichierTxt(createdBy_filename, L", ");
     
        if (creee_par.size() == 0)
        {
            throw std::runtime_error(L"Fichier " + createdBy_filename + L" ne contient aucun nom.");
        }
     
        return creee_par;
    }
    Pas un assert car ce n'est pas une erreur de programmation.

  12. #172
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Créée_par.txt (The crown, série Grande-Bretagne)
    Peter Morgan, Stephen Daldry
    ou
    Peter Morgan
    Stephen Daldry
    ???

  13. #173
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    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 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Si vous passez en second paramètre de la fonction "lire_fichierTxt" la valeur : L", "
    Les 2 formats seront interprétés de la même manière.
    A la fin, vous aurez en valeur de retour un vecteur avec 2 éléments :
    ["Peter Morgan","Stephen Daldry"]

  14. #174
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Quel est le role du premier paramètre : c?
    Il doit être systématiquement égal au contenu de la variable "createdBy_filename".
    Au nom de la variable, le paramètre est un nom de fichier mais le second a ce rôle.
    Si un paramètre n'a aucune utilité, on le supprime.
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    std::vector<std::wstring> Serie::lire_Creee_par()
    {
        std::vector<std::wstring> creee_par = lire_fichierTxt(createdBy_filename, L", ");
    *
        if (creee_par.size() == 0)
        {
            throw std::runtime_error(L"Fichier " + createdBy_filename + L" ne contient aucun nom.");
        }
    *
        return creee_par;
    }
    creee_par, chaine, etc... : Générique !!! / ???
    (https://www.allocine.fr/series/fiche...rie=17598.html,
    Film : https://www.allocine.fr/film/fichefi...lm=292822.html (de, par, etc...)
    Titre : nationalite, genre, netflix, etc... (série et film)

  15. #175
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par bacelar
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    const void Serie::afficher_Creee_par(std::wstring& c, std::wstring const& nomFichier)
    Ce "const" au début, il sert à quoi ???
    Ça ressemble à une tentative de déclarer afficher_Creee_par comme ne modifiant pas l'objet courant.
    Ce qui est, somme toute, une bonne chose à faire, vu que d'après le code posté, la fonction ne modifie effectivement pas l'objet courant.
    C'est juste que pour ça, le mot-clé const doit en fait suivre la déclaration et non la précéder:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void Serie::afficher_Creee_par(std::wstring& c, std::wstring const& nomFichier) const
    {
        assert((c == createdBy_filename) && L"Erreur !!! Créée par... !");
        std::vector<std::wstring> creee_par = lire_fichierTxt(nomFichier, L", ");// , false); //  afficher_fichier_lire n'a pas à renvoyer de la merde, juste lancer des exceptions
        assert((creee_par.size() != 0));
    }

    Reste à savoir pourquoi faire le chargement dans la fonction d'affichage...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #176
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0

  17. #177
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    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 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Quelle est la question ?

  18. #178
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw std::runtime_error(L"Fichier " + nomFichier + L" est vide.");
    Erreur : L"" ???

    Alors :
    Microsoft Visual Studio Community*2022 (64*bits) : Windows :
    https://en-cppreference-com.translat...r&_x_tr_pto=sc
    ===>
    https://stackoverflow-com.translate....r&_x_tr_pto=sc
    Problème ???

  19. #179
    Nouveau Candidat au Club Avatar de Laurent_B_
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2021
    Messages
    383
    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 : 383
    Points : 0
    Points
    0
    Par défaut
    Exemple :
    std::vector<wstring>creee_par; ===> std::vector<u8string>creee_par;
    Oui ou non ?

    (you /t s "e:\Séries.[]\++++\T\The Crown.[2016- Netflix]")
    u8string : 3x10.Un cri du cœur.2020-12-23.txt (cœur)
    et :
    Nom : Capture.PNG
Affichages : 165
Taille : 7,4 Ko
    ???

    Merci beaucoup

  20. #180
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    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 071
    Points : 12 116
    Points
    12 116
    Par défaut
    Citation Envoyé par Laurent_B_ Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw std::runtime_error(L"Fichier " + nomFichier + L" est vide.");
    Erreur : L"" ???

    Alors :
    Microsoft Visual Studio Community*2022 (64*bits) : Windows :
    https://en-cppreference-com.translat...r&_x_tr_pto=sc
    ===>
    https://stackoverflow-com.translate....r&_x_tr_pto=sc
    Problème ???
    Ok, std::runtime_error ne semble pas supporter les wstring, mais pour des messages d'erreurs, c'est pas très grave, car cela n'a rien à faire dans la console, maintenant.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    throw std::runtime_error("Le fichier '" + std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(nomFichier) + "' est vide.");
    (on pourrait faire de "std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes" une MACRO)

    std::vector<wstring>creee_par; ===> std::vector<u8string>creee_par;
    Oui ou non ?
    Pourquoi convertir la wstring en u8string ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 9 sur 30 PremièrePremière ... 567891011121319 ... DernièreDernière

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