Par donc :
L"" ===> u8"" !
Exemple :
std::wstring sj; ===> std::string sj; (u8)
Par donc :
L"" ===> u8"" !
Exemple :
std::wstring sj; ===> std::string sj; (u8)
'L' est une MACRO, je sais pas ce que fait 'u8'.
Il faut juste faire en sorte de pas mélanger les variables d'un type et celles d'un autre.
Utilisez au maximum std::wstring, mais "std::runtime_error" ne le supporte pas, d'où la nécessité de convertir les std::wstring en std::string.
=> créer une MACRO pour la construction des messages d'erreur qui fera la conversion std::wstring en std::string.
Gardez le reste du code en std::wstring.
L n'est pas une macro, c'est un préfixe pour constante.
Je crois que u8 aussi dans les versions les plus récentes du langage.
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.
Bonjour,
Je suis l'orthophoniste de Laurent_B_. Il a subi un AVC il y a plusieurs années. Il a une aphasie, c'est-à-dire des troubles du langage (difficultés pour parler, lire, écrire).
Il utilise le narrateur de l'ordinateur pour lire, mais ça reste difficile pour lui de comprendre, quand les phrases sont longues ou compliquées. Il est aussi fatigable et a donc du mal à traiter un long texte.
Pour écrire, il ne peut pas faire de phrases complètes: les verbes ne viennent pas.
Il vous remercie d'avoir la gentillesse d'essayer de répondre à ses questions. Pourriez-vous faire des réponses plus courtes et des phrases plus simples ? ça l'aiderait encore davantage.
Merci d'avance.
Utiliser 'L' le plus possible et n'utiliser les 'u8' que dans les messages d'erreur lancer avec std::runtime_error.
Si des chaines de caractère std::wstring doivent passer dans les messages d'erreur, utiliser :
Courage et désolé pour les longs pavés.
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(variableContenantUneWString)
On doit pouvoir faire une fonction pour ça, non?
Un truc du genre:
Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::string wstr_to_u8(std::wstring uneWString) { return std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(uneWString); }
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.
Bonjour,
ou
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::string wstr_to_u8(std::wstring uneWString) { return std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(uneWString); }
Unix : oui !
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(variableContenantUneWString)
Mais pas Windows ! (codecvt ???)
----------------------------------------------
et :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 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(L"Fichier " + (std::wstring)nomFichier + L" est vide."); // Marche par !!! throw std::runtime_error("Fichier est vide."); //throw std::runtime_error("Le fichier '" + std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(nomFichier) + "' 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'/*marqueurFinDeLigne*/)) { retVal.push_back(converti.substr(0, pos)); converti = converti.substr(pos + 1/*marqueurFinDeLigne.length()*/); if (pos == std::wstring::npos) break; } return retVal; }
exemple : you /t s "e:\Séries.[]\+++\D\Deadwind.[2018- Netflix]"
ici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 while (std::size_t pos = converti.find(L'\n'/*marqueurFinDeLigne*/)) { retVal.push_back(converti.substr(0, pos)); converti = converti.substr(pos + 1/*marqueurFinDeLigne.length()*/); if (pos == std::wstring::npos) break; }et :Créée par.txt
------------------
Jari Olavi Rantala, Rike Jokela
Kirsi Porkka
", " et ", " ???
------------------------------------------------------
Mais :
Code : 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, std::vector<std::wstring>&c_p) const { assert((c == createdBy_filename) && L"Erreur !!! Créée par... !"); c_p = lire_fichierTxt(nomFichier, L", "); assert((c_p.size() != 0)); }
regrouper en creee_par, en_relation_avec, de, par... ???
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 class Serie { ... std::vector<std::wstring> creee_par; std::vector<std::wstring> en_relation_avec; ... }; ... class Cinema { ... std::vector<std::wstring> de; std::vector<std::wstring> par; ... };
-----------------------------------------
Merci beaucoup![]()
La formule avec "td::wstring_convert<std::codecvt_utf8<wchar_t>>..." est bien trop longue et peu explicite.
Créez la fonction "wstr_to_u8" qui sera bien plus simple à appeler et lisible dans votre code.
Donc l'exemple d'utilisation du code deviendra :
Quel est le problème avec Windows ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
Modification avec utilisation de la fonction "wstr_to_u8", renommage du 2ème paramètre pour qu'il corresponde à son utilisation et son utilisation effective:
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 const std::vector<std::wstring> lire_fichierTxt(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 '" + wstr_to_u8(nomFichier) + "' 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; std::wstring converti = convertiseur.from_bytes(contenuFichier); rtrim(converti); while (std::size_t pos = converti.find(separeteur) { retVal.push_back(converti.substr(0, pos)); converti = converti.substr(pos + separeteur.length()); if (pos == std::wstring::npos) break; } return retVal; }
Vous n'utilisez pas "correctement" le second paramètre.
Si vous voulez que "\n" soit aussi un séparateur, convertissez le second paramètre en un vector de std::wstring et changez la boucle pour qu'elle cherche le premier séparateur présent.
à l'arrache:
(Il doit avoir plus direct avec des librairies ou dans les algorithmes de la STL)
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 const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::vector<std::wstring> separeteurs) { ... bool found = false; do { found = false; size_t pos_found = std::string::npos; std::wstring sep_found = ""; for( auto&& sep : separateurs) { std::size_t pos = converti.find(separeteur); 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 aurez aussi en sortie :
Jari Olavi Rantala, Rike Jokela, Kirsi Porkka
Car l'une de vos routines doit, semble-t-il, ajouter un , entre chaque élément retourné par "lire_fichierTxt".
Vous pouvez peut-être changer le contenu du fichier "Créée par.txt" plutôt que de modifier le type du 2ème paramètre de la fonction "lire_fichierTxt":
soit :
------------------
Jari Olavi Rantala
Rike Jokela
Kirsi Porkka
------------------
------------------
(à lire avec lire_fichierTxt(...,L"\n"))
------------------
soit :
------------------
Jari Olavi Rantala, Rike Jokela, Kirsi Porkka
------------------
------------------
(à lire avec lire_fichierTxt(...,L", "))
------------------
"afficher_Creee_par" ,'a toujours aucun sens, il ne fait pas ce qu'indique son nom.
Je pense qu'il serait très préférable d'avoir que quelques fonctions généralistes que les fonctions spécifiques appelleraient :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 void afficher_contenu_formate(std::wstring const& nomFichier, std::wstring prefixe; std::vector<std::wstring> separateurs) { std::vector<std::wstring> liste_a_afficher = lire_fichierTxt(nomFichier, separateurs); ....(partie qui affiche les données en utilisant le paramètre "prefixe" pour l'afficher avant la liste récupérée) } void Serie::afficher_Creee_par() const{ afficher_contenu_formate(createdBy_filename,L"Créée pars :", {L", "}) }
Marche pas !!!La formule avec "td::wstring_convert<std::codecvt_utf8<wchar_t>>..." est bien trop longue et peu explicite.
Créez la fonction "wstr_to_u8" qui sera bien plus simple à appeler et lisible dans votre code.
Donc l'exemple d'utilisation du code deviendra :
Et :
Marche pas !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
Médinoc :
Marche pas : from_bytes : erreur : ???On doit pouvoir faire une fonction pour ça, non?
Un truc du genre:
Code C++ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::string wstr_to_u8(std::wstring uneWString) { return std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(uneWString); }
Etc...
Plus tard...
Merci à tous...
Bonsoir Bacelar,
===>
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 std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::vector<std::wstring> separeteurs) { ... bool found = false; std::wstring separeteur = separeteurs[0]; // Moi, pas de solition !!! do { found = false; size_t pos_found = std::string::npos; std::wstring sep_found = ""; for( auto&& sep : separateurs) { std::size_t pos = converti.find(separeteur); 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); } }
Merci d'avance![]()
Messages d'erreur SVP.Marche pas !!!
Pourquoi utiliser "separeteur" et pas "sep" à la ligne 16 ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::wstring separeteur = separeteurs[0]; // Moi, pas de solition !!!
Ok ou pas ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::size_t pos = converti.find(separeteur);
Merci![]()
Bin non, si on a passé une liste (std::vector) en paramètre, c'est pour qu'elle serve.
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::size_t pos = converti.find(sep);
Bonjour,
Ok !
Mais, si :
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 const std::vector<std::wstring> lire_fichierTxt(std::wstring const& nomFichier, std::vector<std::wstring> separeteurs) { ... bool found = false; //std::wstring separeteur = separeteurs[0]; // Moi, pas de solition !!! 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) { 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); } return retVal; }
Pas grave !!! ok !Créée par.txt
----------------------
Christina Applegate
Linda Cardellini, James Marsden
Mais :
Pas compris !!! Macro et/ou wstr_to_u8 ? Exemple ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part throw std::runtime_error("Le fichier '" + wstr_to_u8(nomFichier) + "' est vide.");
Merci beaucoup![]()
Heu, pardon !
etCréée par.txt
----------------
Alfred Gough, Miles Millar
???Créée par.txt
----------------
Jan Holoubek
Bartlomiej Ignaciuk
Merci d'avance![]()
En utilisant un std::vector en type de paramètre, vous pouvez avoir plusieurs séparateurs différents.
Ici, juste avec 2 séparateurs, vous gérez aussi bien
queCréée par.txt
----------------------
Christina Applegate
Linda Cardellini, James Marsden
queCréée par.txt
----------------------
Christina Applegate
Linda Cardellini
James Marsden
etc...Créée par.txt
----------------------
Christina Applegate, Linda Cardellini, James Marsden
Faut juste appeler la fonction "lire_fichierTxt" avec les bonnes valeurs de paramètre :
{L"\n",L", "}, c'est un std::vector initialisé avec 2 items :
Code : Sélectionner tout - Visualiser dans une fenêtre à part std::vector<std::wstring> liste_a_afficher = lire_fichierTxt(nomFichier, {L"\n",L", "});
L"\n"
L", "
Ainsi, le retour à la ligne et la "virgule + espace" seront des séparateurs entre les noms des personnes.
Pas besoin de MACRO, c'est une sale habitude que j'ai d'utiliser les MACRO pour la gestion des erreurs.
La fonction "wstr_to_u8" proposée par @Médinoc fera très bien l'affaire, et bien plus "type-safe" qu'une MACRO.
En passant {L"\n",L", "} comme 2ème paramètre de lire_fichierTxt, ça prend aussi ces cas de figure.
Merci beaucoup
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 En utilisant un std::vector en type de paramètre, vous pouvez avoir plusieurs séparateurs différents. ... Merci beaucoup
et :Pas besoin de MACRO, c'est une sale habitude que j'ai d'utiliser les MACRO pour la gestion des erreurs.
La fonction "wstr_to_u8" proposée par @Médinoc fera très bien l'affaire, et bien plus "type-safe" qu'une MACRO.
Marche pas !!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::string wstr_to_u8(std::wstring uneWString) { return std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(uneWString); }
???
Message d'erreur, SVP.Marche pas !!!
Bonjour,
???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::string wstr_to_u8(std::wstring uneWString) { return std::wstring_convert<std::codecvt_utf8<wchar_t>>().from_bytes(uneWString); }
-----------------------------------
Exemple :
Oui ou non ???
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 void afficher_Genre(std::wstring& genre_filename, std::wstring const& nomFichier, 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::wstring::npos) && L"Erreur !!!"); std::wstring radical = genre_filename.substr(0, pos_txt); std::vector<std::wstring>g; g = lire_fichierTxt(nomFichier, { L"\n", L", " }); for (auto&& genre : g) { 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 !!!"); } } // Ici : if(...) E.afficher_X(-1, genres_renvoyes, L"Pas de genre…"); }
Pour :
Merci à tous![]()
Partager